diff --git a/examples/StarWars/StarWars.csproj b/examples/StarWars/StarWars.csproj
index 9d4982e..ac3e35f 100644
--- a/examples/StarWars/StarWars.csproj
+++ b/examples/StarWars/StarWars.csproj
@@ -10,7 +10,7 @@
-
+
diff --git a/src/QueryByShape.Analyzer/AttributeNames.cs b/src/QueryByShape.Analyzer/AttributeNames.cs
index ebf23a7..5d1b0c5 100644
--- a/src/QueryByShape.Analyzer/AttributeNames.cs
+++ b/src/QueryByShape.Analyzer/AttributeNames.cs
@@ -5,7 +5,7 @@ internal static class AttributeNames
public const string JSON_PROPERTY = "System.Text.Json.Serialization.JsonPropertyNameAttribute";
public const string JSON_IGNORE = "System.Text.Json.Serialization.JsonIgnoreAttribute";
public const string QUERY = $"QueryByShape.{nameof(QueryAttribute)}";
- public const string MUTATION = $"QueryByShape.{nameof(MutationAttribute)}";
+ //public const string MUTATION = $"QueryByShape.{nameof(MutationAttribute)}";
public const string VARIABLE = $"QueryByShape.{nameof(VariableAttribute)}";
public const string ARGUMENT = $"QueryByShape.{nameof(ArgumentAttribute)}";
public const string ALIAS_OF = $"QueryByShape.{nameof(AliasOfAttribute)}";
diff --git a/src/QueryByShape.Analyzer/NamedTypeSymbols.cs b/src/QueryByShape.Analyzer/NamedTypeSymbols.cs
index e986ee6..3d4348d 100644
--- a/src/QueryByShape.Analyzer/NamedTypeSymbols.cs
+++ b/src/QueryByShape.Analyzer/NamedTypeSymbols.cs
@@ -40,8 +40,8 @@ public class NamedTypeSymbols(Compilation compilation)
public INamedTypeSymbol OnAttribute => _onAttribute ??= compilation.GetTypeByMetadataName(typeof(OnAttribute).FullName)!;
private INamedTypeSymbol? _onAttribute;
- public INamedTypeSymbol MutationAttribute => _mutationAttribute ??= compilation.GetTypeByMetadataName(typeof(MutationAttribute).FullName)!;
- private INamedTypeSymbol? _mutationAttribute;
+ //public INamedTypeSymbol MutationAttribute => _mutationAttribute ??= compilation.GetTypeByMetadataName(typeof(MutationAttribute).FullName)!;
+ //private INamedTypeSymbol? _mutationAttribute;
public INamedTypeSymbol JsonIgnoreAttribute => _jsonIgnoreAttribute ??= compilation.GetTypeByMetadataName(typeof(JsonIgnoreAttribute).FullName)!;
private INamedTypeSymbol? _jsonIgnoreAttribute;
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Program.cs b/tests/QueryByShape.Analyzer.Benchmark/Program.cs
new file mode 100644
index 0000000..f4a540d
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Program.cs
@@ -0,0 +1,4 @@
+using BenchmarkDotNet.Running;
+using QueryByShape.Analyzer.Benchmark;
+
+var summary = BenchmarkRunner.Run();
\ No newline at end of file
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/AllFilmSummary.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/AllFilmSummary.cs
new file mode 100644
index 0000000..60bac27
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/AllFilmSummary.cs
@@ -0,0 +1,7 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class AllFilmSummary
+ {
+ public List Films { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/AllPlantSummary.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/AllPlantSummary.cs
new file mode 100644
index 0000000..79341ff
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/AllPlantSummary.cs
@@ -0,0 +1,7 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class AllPlantSummary
+ {
+ public List Planets { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/CharacterConnection.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/CharacterConnection.cs
new file mode 100644
index 0000000..edf5d25
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/CharacterConnection.cs
@@ -0,0 +1,7 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class CharacterConnection
+ {
+ public List Characters { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/FilmCharacterConnection.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/FilmCharacterConnection.cs
new file mode 100644
index 0000000..4898ad5
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/FilmCharacterConnection.cs
@@ -0,0 +1,8 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class FilmCharacterConnection
+ {
+ public string Title { get; set; }
+ public CharacterConnection CharacterConnection { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/FilmStarships.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/FilmStarships.cs
new file mode 100644
index 0000000..e856c14
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/FilmStarships.cs
@@ -0,0 +1,7 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class FilmStarships
+ {
+ public List Starships { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/FilmSummary.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/FilmSummary.cs
new file mode 100644
index 0000000..84a7d3f
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/FilmSummary.cs
@@ -0,0 +1,9 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class FilmSummary
+ {
+ public string Title { get; set; }
+ public string Director { get; set; }
+ public DateTime ReleaseDate { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/PeopleCount.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/PeopleCount.cs
new file mode 100644
index 0000000..2b348dd
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/PeopleCount.cs
@@ -0,0 +1,7 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class PeopleCount
+ {
+ public int TotalCount { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/PersonDetails.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/PersonDetails.cs
new file mode 100644
index 0000000..188c557
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/PersonDetails.cs
@@ -0,0 +1,31 @@
+using System.Numerics;
+
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class PersonDetails
+ {
+ public DateTime BirthYear { get; set; }
+
+ public string Name { get; set; }
+
+ public DateTime Created { get; set; }
+
+ public DateTime Edited { get; set; }
+
+ public string EyeColor { get; set; }
+
+ public string Gender { get; set; }
+
+ public string HairColor { get; set; }
+
+ public int Height { get; set; }
+
+ public PlanetSummary Planet { get; set; }
+
+ public decimal Mass { get; set; }
+
+ public string SkinColor { get; set; }
+
+ public string Species { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/PersonVehicles.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/PersonVehicles.cs
new file mode 100644
index 0000000..ea4673d
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/PersonVehicles.cs
@@ -0,0 +1,8 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class PersonVehicles
+ {
+ public string Name { get; set; }
+ public VehicleConnection VehicleConnection { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/PersonVitals.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/PersonVitals.cs
new file mode 100644
index 0000000..1c55455
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/PersonVitals.cs
@@ -0,0 +1,9 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class PersonVitals
+ {
+ public string Name { get; set; }
+ public int Height { get; set; }
+ public decimal Mass { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/PersonWithHomeworld.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/PersonWithHomeworld.cs
new file mode 100644
index 0000000..ef41fd8
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/PersonWithHomeworld.cs
@@ -0,0 +1,8 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class PersonWithHomeworld
+ {
+ public string Name { get; set; }
+ public PlanetSummary Homeworld { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/PlanetResidents.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/PlanetResidents.cs
new file mode 100644
index 0000000..ebb4b43
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/PlanetResidents.cs
@@ -0,0 +1,7 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class PlanetResidents
+ {
+ public List Residents { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/PlanetResidentsConnection.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/PlanetResidentsConnection.cs
new file mode 100644
index 0000000..7b88b3c
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/PlanetResidentsConnection.cs
@@ -0,0 +1,7 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class PlanetResidentsConnection
+ {
+ public PlanetResidents ResidenceConnection { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/PlanetSummary.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/PlanetSummary.cs
new file mode 100644
index 0000000..ad46307
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/PlanetSummary.cs
@@ -0,0 +1,9 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class PlanetSummary
+ {
+ public string Name { get; set; }
+ public List Terrain { get; set; }
+ public string Gravity { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryComparePeople.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryComparePeople.cs
new file mode 100644
index 0000000..f03898f
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryComparePeople.cs
@@ -0,0 +1,16 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ [Query]
+ [Variable("$person1ID", "ID!")]
+ [Variable("$person2ID", "ID!")]
+ public partial class QueryComparePeople : IGeneratedQuery
+ {
+ [Argument("person1ID", "$person1ID")]
+ [AliasOf("Person")]
+ public PersonDetails PersonOne { get; set; }
+
+ [Argument("person2ID", "$person2ID")]
+ [AliasOf("Person")]
+ public PersonDetails PersonTwo { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryFilmById.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryFilmById.cs
new file mode 100644
index 0000000..e464440
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryFilmById.cs
@@ -0,0 +1,10 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ [Query]
+ [Variable("$filmID", "ID!")]
+ public partial class QueryFilmById : IGeneratedQuery
+ {
+ [Argument("filmID", "$filmID")]
+ public FilmSummary Film { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryFilmCharacters.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryFilmCharacters.cs
new file mode 100644
index 0000000..90add7b
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryFilmCharacters.cs
@@ -0,0 +1,10 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ [Query]
+ [Variable("$filmID", "ID!")]
+ public partial class QueryFilmCharacters : IGeneratedQuery
+ {
+ [Argument("filmID", "$filmID")]
+ public FilmCharacterConnection Film { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryFilmListAll.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryFilmListAll.cs
new file mode 100644
index 0000000..7b25406
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryFilmListAll.cs
@@ -0,0 +1,11 @@
+using System.Text.Json.Serialization;
+
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ [Query]
+ public partial class QueryFilmListAll : IGeneratedQuery
+ {
+ [JsonPropertyName("AllFilms")]
+ public AllFilmSummary Films { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPeopleCount.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPeopleCount.cs
new file mode 100644
index 0000000..2e21805
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPeopleCount.cs
@@ -0,0 +1,8 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ [Query]
+ public partial class QueryPeopleCount : IGeneratedQuery
+ {
+ public PeopleCount AllPeople { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPersonAndHomeworldById.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPersonAndHomeworldById.cs
new file mode 100644
index 0000000..21854ed
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPersonAndHomeworldById.cs
@@ -0,0 +1,10 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ [Query]
+ [Variable("$personID", "ID!")]
+ public partial class QueryPersonAndHomeworldById : IGeneratedQuery
+ {
+ [Argument("personID", "$personID")]
+ public PersonWithHomeworld Person { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPlanetById.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPlanetById.cs
new file mode 100644
index 0000000..e032d2e
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPlanetById.cs
@@ -0,0 +1,18 @@
+using QueryByShape;
+using QueryByShape.Analyzer.Benchmark.Queries;
+using System.Text.Json.Serialization;
+
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ [Query]
+ [Variable("$planetID", "ID!")]
+ public partial class QueryPlanetById : IGeneratedQuery
+ {
+ [Argument("planetID", "$planetID")]
+ public PlanetSummary Planet { get; set; }
+
+ [JsonIgnore]
+ public string IgnoredProperty { get; set; }
+
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPlanetList.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPlanetList.cs
new file mode 100644
index 0000000..57f55be
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPlanetList.cs
@@ -0,0 +1,11 @@
+using System.Text.Json.Serialization;
+
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ [Query]
+ public partial class QueryPlanetList : IGeneratedQuery
+ {
+ [JsonPropertyName("AllPlanets")]
+ public AllPlantSummary Planets { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryResidentsByPlanetId.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryResidentsByPlanetId.cs
new file mode 100644
index 0000000..95baf0e
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryResidentsByPlanetId.cs
@@ -0,0 +1,10 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ [Query]
+ [Variable("$planetID", "ID!")]
+ public partial class QueryResidentsByPlanetId : IGeneratedQuery
+ {
+ [Argument("planetID", "$planetID")]
+ public PlanetResidentsConnection Planet { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/QuerySpeciesById.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/QuerySpeciesById.cs
new file mode 100644
index 0000000..5bc85ed
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/QuerySpeciesById.cs
@@ -0,0 +1,10 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ [Query]
+ [Variable("$speciesID", "ID!")]
+ public partial class QuerySpeciesById : IGeneratedQuery
+ {
+ [Argument("speciesID", "$speciesID")]
+ public SpeciesSummary Starship { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryStarshipById.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryStarshipById.cs
new file mode 100644
index 0000000..b4b76e3
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryStarshipById.cs
@@ -0,0 +1,10 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ [Query]
+ [Variable("$starshipID", "ID!")]
+ public partial class QueryStarshipById : IGeneratedQuery
+ {
+ [Argument("starshipID", "$starshipID")]
+ public StarshipSummary Starship { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryStarshipsByFilmId.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryStarshipsByFilmId.cs
new file mode 100644
index 0000000..8e4c401
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryStarshipsByFilmId.cs
@@ -0,0 +1,10 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ [Query]
+ [Variable("$filmID", "ID!")]
+ public partial class QueryStarshipsByFilmId : IGeneratedQuery
+ {
+ [Argument("filmID", "$filmID")]
+ public FilmStarships Film { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryVehiclesByPersonId.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryVehiclesByPersonId.cs
new file mode 100644
index 0000000..b0defa3
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryVehiclesByPersonId.cs
@@ -0,0 +1,10 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ [Query]
+ [Variable("$personID", "ID!")]
+ public partial class QueryVehiclesByPersonId : IGeneratedQuery
+ {
+ [Argument("personID", "$personID")]
+ public PersonVehicles Person { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryVitalByPerson.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryVitalByPerson.cs
new file mode 100644
index 0000000..424f842
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/QueryVitalByPerson.cs
@@ -0,0 +1,10 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ [Query]
+ [Variable("$personID", "ID!")]
+ public partial class QueryVitalByPersonId : IGeneratedQuery
+ {
+ [Argument("personID", "$personID")]
+ public PersonVitals Person { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/SpeciesSummary.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/SpeciesSummary.cs
new file mode 100644
index 0000000..8831ded
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/SpeciesSummary.cs
@@ -0,0 +1,9 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class SpeciesSummary
+ {
+ public string Name { get; set; }
+ public string Classification { get; set; }
+ public decimal AverageHeight { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/StarshipSummary.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/StarshipSummary.cs
new file mode 100644
index 0000000..4433076
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/StarshipSummary.cs
@@ -0,0 +1,8 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class StarshipSummary
+ {
+ public string Name { get; set; }
+ public string Model { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/VehicleConnection.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/VehicleConnection.cs
new file mode 100644
index 0000000..9985de6
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/VehicleConnection.cs
@@ -0,0 +1,7 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class VehicleConnection
+ {
+ public List Vehicles { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/Queries/VehicleSummary.cs b/tests/QueryByShape.Analyzer.Benchmark/Queries/VehicleSummary.cs
new file mode 100644
index 0000000..3e2656f
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/Queries/VehicleSummary.cs
@@ -0,0 +1,9 @@
+namespace QueryByShape.Analyzer.Benchmark.Queries
+{
+ public class VehicleSummary
+ {
+ public string Name { get; set; }
+ public string Model { get; set; }
+ public decimal CostInCredits { get; set; }
+ }
+}
diff --git a/tests/QueryByShape.Analyzer.Benchmark/QueryByShape.Analyzer.Benchmark.csproj b/tests/QueryByShape.Analyzer.Benchmark/QueryByShape.Analyzer.Benchmark.csproj
new file mode 100644
index 0000000..9513a75
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/QueryByShape.Analyzer.Benchmark.csproj
@@ -0,0 +1,34 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ disable
+
+
+
+
+
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/QueryByShape.Analyzer.Benchmark/SourceGeneratorBenchmark.cs b/tests/QueryByShape.Analyzer.Benchmark/SourceGeneratorBenchmark.cs
new file mode 100644
index 0000000..4e5cafa
--- /dev/null
+++ b/tests/QueryByShape.Analyzer.Benchmark/SourceGeneratorBenchmark.cs
@@ -0,0 +1,72 @@
+using BenchmarkDotNet.Attributes;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.Text;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.Json.Serialization;
+using System.Threading.Tasks;
+
+namespace QueryByShape.Analyzer.Benchmark
+{
+ [MemoryDiagnoser]
+ public class SourceGeneratorBenchmark
+ {
+ private SyntaxTree[] _syntaxTrees;
+ private MetadataReference[] _references;
+ private CSharpCompilation _compilation;
+
+ [GlobalSetup]
+ public void GlobalSetup()
+ {
+ string baseDirectory = AppContext.BaseDirectory;
+ Console.WriteLine($"Base Directory: {baseDirectory}");
+ string directory = Path.GetFullPath(Path.Combine(baseDirectory, @"..\..\..\..\..\..\..\Queries"));
+ Console.WriteLine($"Loading source files from: {directory}");
+ var trees = new List();
+
+ foreach (string file in Directory.EnumerateFiles(directory))
+ {
+ string fileSource = File.ReadAllText(file);
+ trees.Add(CSharpSyntaxTree.ParseText(fileSource));
+ }
+
+ _syntaxTrees = trees.ToArray();
+
+
+ _references = AppDomain.CurrentDomain.GetAssemblies()
+ .Where(assembly => !assembly.IsDynamic)
+ .Select(assembly => MetadataReference.CreateFromFile(assembly.Location))
+ .Cast()
+ .Concat(new[] {
+ MetadataReference.CreateFromFile(typeof(IGeneratedQuery).Assembly.Location),
+ MetadataReference.CreateFromFile(typeof(QueryAttribute).Assembly.Location),
+ MetadataReference.CreateFromFile(typeof(JsonIgnoreAttribute).Assembly.Location),
+ }).ToArray();
+ }
+
+ [IterationSetup]
+ public void IterationSetup()
+ {
+ _compilation = CSharpCompilation.Create("SourceGeneratorTests",
+ _syntaxTrees,
+ _references,
+ new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
+ }
+
+ [Benchmark]
+ public void RunGenerator()
+ {
+ var generator = new QueryGenerator();
+
+ GeneratorDriver driver = CSharpGeneratorDriver
+ .Create(generator)
+ .RunGenerators(_compilation);
+
+ //var results = driver.GetRunResult().Results.SelectMany(x => x.GeneratedSources).Select(x => x.SourceText.ToString()).ToArray();
+ //return string.Join('\n', results);
+ }
+ }
+}