From a885ea410193850188b59823154e39aa6d6b0077 Mon Sep 17 00:00:00 2001 From: Mike Pringle Date: Sun, 9 Nov 2025 15:09:24 -0500 Subject: [PATCH 1/2] Benchmark Sourcegenerator --- examples/StarWars/StarWars.csproj | 2 +- .../Program.cs | 4 ++ .../Queries/AllFilmSummary.cs | 7 ++ .../Queries/AllPlantSummary.cs | 7 ++ .../Queries/CharacterConnection.cs | 7 ++ .../Queries/FilmCharacterConnection.cs | 8 +++ .../Queries/FilmStarships.cs | 7 ++ .../Queries/FilmSummary.cs | 9 +++ .../Queries/PeopleCount.cs | 7 ++ .../Queries/PersonDetails.cs | 31 ++++++++ .../Queries/PersonVehicles.cs | 8 +++ .../Queries/PersonVitals.cs | 9 +++ .../Queries/PersonWithHomeworld.cs | 8 +++ .../Queries/PlanetResidents.cs | 7 ++ .../Queries/PlanetResidentsConnection.cs | 7 ++ .../Queries/PlanetSummary.cs | 9 +++ .../Queries/QueryComparePeople.cs | 16 +++++ .../Queries/QueryFilmById.cs | 10 +++ .../Queries/QueryFilmCharacters.cs | 10 +++ .../Queries/QueryFilmListAll.cs | 11 +++ .../Queries/QueryPeopleCount.cs | 8 +++ .../Queries/QueryPersonAndHomeworldById.cs | 10 +++ .../Queries/QueryPlanetById.cs | 18 +++++ .../Queries/QueryPlanetList.cs | 11 +++ .../Queries/QueryResidentsByPlanetId.cs | 10 +++ .../Queries/QuerySpeciesById.cs | 10 +++ .../Queries/QueryStarshipById.cs | 10 +++ .../Queries/QueryStarshipsByFilmId.cs | 10 +++ .../Queries/QueryVehiclesByPersonId.cs | 10 +++ .../Queries/QueryVitalByPerson.cs | 10 +++ .../Queries/SpeciesSummary.cs | 9 +++ .../Queries/StarshipSummary.cs | 8 +++ .../Queries/VehicleConnection.cs | 7 ++ .../Queries/VehicleSummary.cs | 9 +++ .../QueryByShape.Analyzer.Benchmark.csproj | 34 +++++++++ .../SourceGeneratorBenchmark.cs | 72 +++++++++++++++++++ 36 files changed, 429 insertions(+), 1 deletion(-) create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Program.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/AllFilmSummary.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/AllPlantSummary.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/CharacterConnection.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/FilmCharacterConnection.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/FilmStarships.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/FilmSummary.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/PeopleCount.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/PersonDetails.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/PersonVehicles.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/PersonVitals.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/PersonWithHomeworld.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/PlanetResidents.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/PlanetResidentsConnection.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/PlanetSummary.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/QueryComparePeople.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/QueryFilmById.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/QueryFilmCharacters.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/QueryFilmListAll.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPeopleCount.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPersonAndHomeworldById.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPlanetById.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/QueryPlanetList.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/QueryResidentsByPlanetId.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/QuerySpeciesById.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/QueryStarshipById.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/QueryStarshipsByFilmId.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/QueryVehiclesByPersonId.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/QueryVitalByPerson.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/SpeciesSummary.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/StarshipSummary.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/VehicleConnection.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/Queries/VehicleSummary.cs create mode 100644 tests/QueryByShape.Analyzer.Benchmark/QueryByShape.Analyzer.Benchmark.csproj create mode 100644 tests/QueryByShape.Analyzer.Benchmark/SourceGeneratorBenchmark.cs 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/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); + } + } +} From eb1064012265728de0de421cfdeeaaa14b0b2caf Mon Sep 17 00:00:00 2001 From: Mike Pringle Date: Sun, 9 Nov 2025 15:15:04 -0500 Subject: [PATCH 2/2] Future Mutation attribute --- src/QueryByShape.Analyzer/AttributeNames.cs | 2 +- src/QueryByShape.Analyzer/NamedTypeSymbols.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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;