From 5ab48480e630e790875cc804d707b9bb8cfc81ae Mon Sep 17 00:00:00 2001 From: Struan Judd Date: Sun, 24 Dec 2023 13:28:19 +1300 Subject: [PATCH] Refactor IMerge to be IEnumerable --- GqlPlus.sln | 10 ---------- src/GqlPlus.Verifier/Merging/BaseMerger.cs | 8 ++++---- src/GqlPlus.Verifier/Merging/GroupsMerger.cs | 4 ++-- src/GqlPlus.Verifier/Merging/IMerge.cs | 4 ++-- src/GqlPlus.Verifier/Merging/MergeAllTypes.cs | 15 +++++++-------- src/GqlPlus.Verifier/Merging/MergeCategories.cs | 2 +- src/GqlPlus.Verifier/Merging/MergeDirectives.cs | 4 ++-- src/GqlPlus.Verifier/Merging/MergeEnums.cs | 4 ++-- src/GqlPlus.Verifier/Merging/MergeExtensions.cs | 11 ++++------- src/GqlPlus.Verifier/Merging/MergeInputFields.cs | 2 +- src/GqlPlus.Verifier/Merging/MergeOutputFields.cs | 2 +- src/GqlPlus.Verifier/Merging/MergeScalars.cs | 2 +- src/GqlPlus.Verifier/Merging/MergeSchemas.cs | 10 +++++----- src/GqlPlus.Verifier/Merging/ObjectsMerger.cs | 8 ++++---- .../Merging/MergeTypeParametersTests.cs | 2 +- .../Merging/TestBase.cs | 2 +- 16 files changed, 38 insertions(+), 52 deletions(-) diff --git a/GqlPlus.sln b/GqlPlus.sln index e8c44937..bd28e8ed 100644 --- a/GqlPlus.sln +++ b/GqlPlus.sln @@ -20,22 +20,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .editorconfig = .editorconfig .gitignore = .gitignore .prettierrc.yml = .prettierrc.yml - collect-all.ps1 = collect-all.ps1 coverage.ps1 = coverage.ps1 coverage.runsettings = coverage.runsettings Directory.Build.props = Directory.Build.props .github\workflows\dotnet-test.yml = .github\workflows\dotnet-test.yml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "graphql-plus", "graphql-plus", "{74C0DC37-FD8F-419A-A5CE-A0F27946F3B0}" - ProjectSection(SolutionItems) = preProject - graphql-plus\Definition.md = graphql-plus\Definition.md - graphql-plus\Introspection.md = graphql-plus\Introspection.md - graphql-plus\Operation.md = graphql-plus\Operation.md - graphql-plus\Schema.md = graphql-plus\Schema.md - graphql-plus\toc.yml = graphql-plus\toc.yml - EndProjectSection -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GqlPlus.Verifier.ComponentTests", "test\GqlPlus.Verifier.ComponentTests\GqlPlus.Verifier.ComponentTests.csproj", "{D97ABCF2-E6C4-4384-AFB7-C55943EBE1E2}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GqlPlus.Verifier.TestBase", "test\GqlPlus.Verifier.TestBase\GqlPlus.Verifier.TestBase.csproj", "{B73CDEC7-3F67-444E-8A06-16C20DF56DFB}" diff --git a/src/GqlPlus.Verifier/Merging/BaseMerger.cs b/src/GqlPlus.Verifier/Merging/BaseMerger.cs index 8910e9c8..0b4776f5 100644 --- a/src/GqlPlus.Verifier/Merging/BaseMerger.cs +++ b/src/GqlPlus.Verifier/Merging/BaseMerger.cs @@ -3,9 +3,9 @@ public class BaseMerger : IMerge { - public virtual bool CanMerge(TItem[] items) - => items.Length > 0; + public virtual bool CanMerge(IEnumerable items) + => items.Any(); - public virtual TItem[] Merge(TItem[] items) - => items ?? []; + public virtual IEnumerable Merge(IEnumerable items) + => items ?? Enumerable.Empty(); } diff --git a/src/GqlPlus.Verifier/Merging/GroupsMerger.cs b/src/GqlPlus.Verifier/Merging/GroupsMerger.cs index 02af1ab7..36003cf1 100644 --- a/src/GqlPlus.Verifier/Merging/GroupsMerger.cs +++ b/src/GqlPlus.Verifier/Merging/GroupsMerger.cs @@ -9,9 +9,9 @@ public abstract class GroupsMerger protected abstract bool CanMergeGroup(IGrouping group); - public override bool CanMerge(TItem[] items) + public override bool CanMerge(IEnumerable items) => base.CanMerge(items) && items.GroupBy(ItemGroupKey).All(CanMergeGroup); - public override TItem[] Merge(TItem[] items) + public override IEnumerable Merge(IEnumerable items) => items?.GroupMerger(ItemGroupKey, MergeGroup) ?? []; } diff --git a/src/GqlPlus.Verifier/Merging/IMerge.cs b/src/GqlPlus.Verifier/Merging/IMerge.cs index 87e67369..d57768f7 100644 --- a/src/GqlPlus.Verifier/Merging/IMerge.cs +++ b/src/GqlPlus.Verifier/Merging/IMerge.cs @@ -2,6 +2,6 @@ public interface IMerge { - bool CanMerge(TItem[] items); - TItem[] Merge(TItem[] items); + bool CanMerge(IEnumerable items); + IEnumerable Merge(IEnumerable items); } diff --git a/src/GqlPlus.Verifier/Merging/MergeAllTypes.cs b/src/GqlPlus.Verifier/Merging/MergeAllTypes.cs index a7683f02..22df32ef 100644 --- a/src/GqlPlus.Verifier/Merging/MergeAllTypes.cs +++ b/src/GqlPlus.Verifier/Merging/MergeAllTypes.cs @@ -1,5 +1,4 @@ -using GqlPlus.Verifier.Ast; -using GqlPlus.Verifier.Ast.Schema; +using GqlPlus.Verifier.Ast.Schema; namespace GqlPlus.Verifier.Merging; @@ -10,19 +9,19 @@ internal class MergeAllTypes( IMerge scalars ) : IMerge { - public bool CanMerge(AstType[] items) + public bool CanMerge(IEnumerable items) { FixupEnums(items.OfType(), items.OfType()); return items.Select(i => i.GetType()).Distinct().Count() == 1; } - public AstType[] Merge(AstType[] items) + public IEnumerable Merge(IEnumerable items) { - var enumTypes = items.ArrayOf(); - var inputTypes = items.ArrayOf(); - var outputTypes = items.ArrayOf(); - var scalarTypes = items.ArrayOf(); + var enumTypes = items.OfType(); + var inputTypes = items.OfType(); + var outputTypes = items.OfType(); + var scalarTypes = items.OfType(); FixupEnums(enumTypes, outputTypes); diff --git a/src/GqlPlus.Verifier/Merging/MergeCategories.cs b/src/GqlPlus.Verifier/Merging/MergeCategories.cs index e6e59f98..3703cfd3 100644 --- a/src/GqlPlus.Verifier/Merging/MergeCategories.cs +++ b/src/GqlPlus.Verifier/Merging/MergeCategories.cs @@ -5,7 +5,7 @@ namespace GqlPlus.Verifier.Merging; internal class MergeCategories : AliasedMerger { - public override bool CanMerge(CategoryDeclAst[] items) + public override bool CanMerge(IEnumerable items) => base.CanMerge(items) && items.CanMerge(item => item.Option); diff --git a/src/GqlPlus.Verifier/Merging/MergeDirectives.cs b/src/GqlPlus.Verifier/Merging/MergeDirectives.cs index 6feca328..b225b3cd 100644 --- a/src/GqlPlus.Verifier/Merging/MergeDirectives.cs +++ b/src/GqlPlus.Verifier/Merging/MergeDirectives.cs @@ -9,13 +9,13 @@ IMerge parameters protected override string ItemMatchKey(DirectiveDeclAst item) => item.Option.ToString(); - public override bool CanMerge(DirectiveDeclAst[] items) + public override bool CanMerge(IEnumerable items) => base.CanMerge(items) && items.ManyCanMerge(d => d.Parameters, parameters); protected override DirectiveDeclAst MergeGroup(IEnumerable group) => base.MergeGroup(group) with { - Parameters = group.ManyMerge(item => item.Parameters, parameters), + Parameters = [.. group.ManyMerge(item => item.Parameters, parameters)], Locations = group.Aggregate(DirectiveLocation.None, (l, d) => d.Locations | l), }; } diff --git a/src/GqlPlus.Verifier/Merging/MergeEnums.cs b/src/GqlPlus.Verifier/Merging/MergeEnums.cs index c377a683..cafc504e 100644 --- a/src/GqlPlus.Verifier/Merging/MergeEnums.cs +++ b/src/GqlPlus.Verifier/Merging/MergeEnums.cs @@ -9,12 +9,12 @@ IMerge enumValues protected override string ItemMatchKey(EnumDeclAst item) => item.Extends ?? ""; - public override bool CanMerge(EnumDeclAst[] items) + public override bool CanMerge(IEnumerable items) => base.CanMerge(items) && items.ManyCanMerge(e => e.Values, enumValues); protected override EnumDeclAst MergeGroup(IEnumerable group) => base.MergeGroup(group) with { - Values = group.ManyMerge(item => item.Values, enumValues), + Values = [.. group.ManyMerge(item => item.Values, enumValues)], }; } diff --git a/src/GqlPlus.Verifier/Merging/MergeExtensions.cs b/src/GqlPlus.Verifier/Merging/MergeExtensions.cs index b0dbddaa..8c5e3495 100644 --- a/src/GqlPlus.Verifier/Merging/MergeExtensions.cs +++ b/src/GqlPlus.Verifier/Merging/MergeExtensions.cs @@ -79,7 +79,7 @@ public static string[] MergeAliases(this IEnumerable items) where TItem : AstAliased => [.. items.SelectMany(item => item.Aliases).Distinct()]; - public static TItem[] GroupMerger(this IEnumerable items, Func key, Func merger) + public static IEnumerable GroupMerger(this IEnumerable items, Func key, Func merger) { List> result = []; var groups = items.Select(Indexed.To).GroupBy(i => key(i.Item)); @@ -89,14 +89,11 @@ public static TItem[] GroupMerger(this IEnumerable items, Func i.Index))); } - return [.. result.OrderBy(i => i.Index).Select(i => i.Item)]; + return result.OrderBy(i => i.Index).Select(i => i.Item); } - public static TGroup[] ManyMerge(this IEnumerable items, Func> many, IMerge merger) - { - TGroup[] items1 = [.. items.SelectMany(many)]; - return merger.Merge(items1); - } + public static IEnumerable ManyMerge(this IEnumerable items, Func> many, IMerge merger) + => merger.Merge(items.SelectMany(many)); private record struct Indexed(TItem Item, int Index) { diff --git a/src/GqlPlus.Verifier/Merging/MergeInputFields.cs b/src/GqlPlus.Verifier/Merging/MergeInputFields.cs index a04a9388..1a643cbc 100644 --- a/src/GqlPlus.Verifier/Merging/MergeInputFields.cs +++ b/src/GqlPlus.Verifier/Merging/MergeInputFields.cs @@ -5,7 +5,7 @@ namespace GqlPlus.Verifier.Merging; internal class MergeInputFields : FieldsMerger { - public override bool CanMerge(InputFieldAst[] items) + public override bool CanMerge(IEnumerable items) => base.CanMerge(items) && items.CanMerge(item => item.Default); } diff --git a/src/GqlPlus.Verifier/Merging/MergeOutputFields.cs b/src/GqlPlus.Verifier/Merging/MergeOutputFields.cs index d1ea758e..32bef313 100644 --- a/src/GqlPlus.Verifier/Merging/MergeOutputFields.cs +++ b/src/GqlPlus.Verifier/Merging/MergeOutputFields.cs @@ -12,6 +12,6 @@ protected override bool CanMergeGroup(IGrouping group) protected override OutputFieldAst MergeGroup(IEnumerable group) => base.MergeGroup(group) with { - Parameters = group.ManyMerge(item => item.Parameters, parameters), + Parameters = [.. group.ManyMerge(item => item.Parameters, parameters)], }; } diff --git a/src/GqlPlus.Verifier/Merging/MergeScalars.cs b/src/GqlPlus.Verifier/Merging/MergeScalars.cs index 3fa8122b..27ba5c4c 100644 --- a/src/GqlPlus.Verifier/Merging/MergeScalars.cs +++ b/src/GqlPlus.Verifier/Merging/MergeScalars.cs @@ -10,7 +10,7 @@ IMerge regexes protected override string ItemMatchKey(ScalarDeclAst item) => item.Kind.ToString(); - public override bool CanMerge(ScalarDeclAst[] items) + public override bool CanMerge(IEnumerable items) => base.CanMerge(items) && items.ManyCanMerge(i => i.Ranges, ranges) && items.ManyGroupCanMerge(i => i.Regexes, r => r.Regex, regexes); diff --git a/src/GqlPlus.Verifier/Merging/MergeSchemas.cs b/src/GqlPlus.Verifier/Merging/MergeSchemas.cs index 2e8d9d87..b8600d2e 100644 --- a/src/GqlPlus.Verifier/Merging/MergeSchemas.cs +++ b/src/GqlPlus.Verifier/Merging/MergeSchemas.cs @@ -17,17 +17,17 @@ protected override bool CanMergeGroup(IGrouping group) var directives = Just(group); var astTypes = Just(group); - var categoriesCanMerge = categories.Length == 0 || categoryMerger.CanMerge(categories); - var directivesCanMerge = directives.Length == 0 || directiveMerger.CanMerge(directives); - var astTypesCanMerge = astTypes.Length == 0 || astTypeMerger.CanMerge(astTypes); + var categoriesCanMerge = categories.Any() || categoryMerger.CanMerge(categories); + var directivesCanMerge = directives.Any() || directiveMerger.CanMerge(directives); + var astTypesCanMerge = astTypes.Any() || astTypeMerger.CanMerge(astTypes); return categoriesCanMerge && directivesCanMerge && (astTypesCanMerge || true); } - private static TItem[] Just(IEnumerable group) - => group.SelectMany(item => item.Declarations.OfType()).ToArray(); + private static IEnumerable Just(IEnumerable group) + => group.SelectMany(item => item.Declarations.OfType()); protected override SchemaAst MergeGroup(IEnumerable group) { diff --git a/src/GqlPlus.Verifier/Merging/ObjectsMerger.cs b/src/GqlPlus.Verifier/Merging/ObjectsMerger.cs index 270c7127..c7179ad8 100644 --- a/src/GqlPlus.Verifier/Merging/ObjectsMerger.cs +++ b/src/GqlPlus.Verifier/Merging/ObjectsMerger.cs @@ -15,7 +15,7 @@ IMerge fields protected override string ItemMatchKey(TObject item) => item.Extends?.Name ?? ""; - public override bool CanMerge(TObject[] items) + public override bool CanMerge(IEnumerable items) { var baseCanMerge = base.CanMerge(items); var typeParametersCanMerge = items.ManyCanMerge(item => item.TypeParameters, typeParameters); @@ -32,9 +32,9 @@ protected override TObject MergeGroup(IEnumerable group) var alternateAsts = group.ManyMerge(item => item.Alternates, alternates); return base.MergeGroup(group) with { - TypeParameters = typeParameterAsts, - Fields = fieldAsts, - Alternates = alternateAsts, + TypeParameters = [.. typeParameterAsts], + Fields = [.. fieldAsts], + Alternates = [.. alternateAsts], }; } } diff --git a/test/GqlPlus.Verifier.ClassTests/Merging/MergeTypeParametersTests.cs b/test/GqlPlus.Verifier.ClassTests/Merging/MergeTypeParametersTests.cs index b7b1d557..85c9b8a2 100644 --- a/test/GqlPlus.Verifier.ClassTests/Merging/MergeTypeParametersTests.cs +++ b/test/GqlPlus.Verifier.ClassTests/Merging/MergeTypeParametersTests.cs @@ -15,7 +15,7 @@ public void Merge_ManyItems_ReturnsItem(string name) using var scope = new AssertionScope(); - result.Should().BeOfType(); + result.Should().BeAssignableTo>(); } private readonly MergeTypeParameters _merger = new(); diff --git a/test/GqlPlus.Verifier.ClassTests/Merging/TestBase.cs b/test/GqlPlus.Verifier.ClassTests/Merging/TestBase.cs index cf2f4d8e..689d7d29 100644 --- a/test/GqlPlus.Verifier.ClassTests/Merging/TestBase.cs +++ b/test/GqlPlus.Verifier.ClassTests/Merging/TestBase.cs @@ -75,7 +75,7 @@ protected void Merge_Expected(TItem[] items, params TItem[] expected) using var scope = new AssertionScope(); - result.Should().BeOfType(); + result.Should().BeAssignableTo>(); result.Should().BeEquivalentTo(expected); } }