Skip to content

Commit

Permalink
Merge pull request #103 from byme8/feature/array-type-replacement
Browse files Browse the repository at this point in the history
Fix type replacement inside the nullable array.
  • Loading branch information
byme8 authored Apr 30, 2024
2 parents 61ce142 + 8588248 commit aac1317
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 46 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
[
[ZeroQL.GraphQLType("Staff")]
[System.CodeDom.Compiler.GeneratedCode ( "ZeroQL" , "1.0.0.0" )]
public class StaffZeroQL
{
[ZeroQL.GraphQLName("id")]
[JsonPropertyName("id")]
public int Id { get; set; }

[JsonPropertyName("staff")]
[global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)]
public StaffZeroQL? []? __Staff { get; set; }

[ZeroQL.GraphQLName("staff")]
public T?[]? Staff<T>(Func<StaffZeroQL, T> selector = default !)
{
return __Staff?.Select(o => o is null ? default : selector(o)).ToArray();
}
}

]
31 changes: 31 additions & 0 deletions src/ZeroQL.Tests/Bootstrap/CustomSchemaParseTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,37 @@ interface Limit {

await Verify(clases);
}

[Fact]
public async Task IdenticalNamesForArrayReplaced()
{
var rawSchema = @"
schema {
query: Query
}
type Query {
staff: Staff!
}
type Staff {
id: Int!
staff: [Staff]
}
";

var csharp = GraphQLGenerator.ToCSharp(rawSchema, "TestApp", "GraphQLClient");
var syntaxTree = CSharpSyntaxTree.ParseText(csharp);

var clases = (await syntaxTree.GetRootAsync())
.DescendantNodes()
.OfType<ClassDeclarationSyntax>()
.Where(o => o.Identifier.ValueText.Contains("Staff"))
.Select(o => o.ToFullString())
.ToArray();

await Verify(clases);
}

[Fact]
public async Task InputTypeNameIdenticalToPropertyName()
Expand Down
12 changes: 0 additions & 12 deletions src/ZeroQL.Tests/ZeroQL.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,4 @@
<ProjectReference Include="..\ZeroQL.TestServer\ZeroQL.TestServer.csproj" />
</ItemGroup>

<ItemGroup>
<None Update="SourceGeneration\OptionalParametersDetectionTests.AppliedToWrongType.verified.txt">
<ParentFile>OnSyntaxTests</ParentFile>
<DependentUpon>OptionalParametersDetectionTests.cs</DependentUpon>
</None>
<None Update="SourceGeneration\OptionalParametersDetectionTests.Union.verified.txt">
<ParentFile>OnSyntaxTests</ParentFile>
<DependentUpon>OptionalParametersDetectionTests.cs</DependentUpon>
</None>
<None Remove="SourceGeneration\OptionalParametersDetectionTests.Interfaces.verified.txt" />
</ItemGroup>

</Project>
57 changes: 23 additions & 34 deletions src/ZeroQL.Tools/Bootstrap/GraphQLGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,8 @@ private static (string? Query, string? Mutation) GetQueryAndMutation(GraphQLDocu
private static CompilationUnitSyntax FixTypeNamingWhenNameEqualsMemberName(
CompilationUnitSyntax unit)
{
var classesWhenClassNameEqualsToPropertyName = unit.DescendantNodes()
var classesWhenClassNameEqualsToPropertyName = unit
.DescendantNodes()
.OfType<ClassDeclarationSyntax>()
.Where(o => o.Members
.OfType<PropertyDeclarationSyntax>()
Expand All @@ -203,23 +204,27 @@ private static CompilationUnitSyntax FixTypeNamingWhenNameEqualsMemberName(
unit = unit.ReplaceNodes(classesWhenClassNameEqualsToPropertyName,
(oldNode, _) => changedClasses[oldNode.Identifier.Text]);

var propertyTypes = unit.DescendantNodes()
var propertyTypes = unit
.DescendantNodes()
.OfType<PropertyDeclarationSyntax>()
.Select(o => o.Type)
.ToArray();

var methodTypes = unit.DescendantNodes()
var methodTypes = unit
.DescendantNodes()
.OfType<MethodDeclarationSyntax>()
.Select(o => o.ReturnType)
.ToArray();

var methodParameters = unit.DescendantNodes()
var methodParameters = unit
.DescendantNodes()
.OfType<MethodDeclarationSyntax>()
.SelectMany(o => o.ParameterList.Parameters)
.Select(o => o.Type)
.ToArray();

var genericTypes = unit.DescendantNodes()
var genericTypes = unit
.DescendantNodes()
.OfType<GenericNameSyntax>()
.Select(o => o.TypeArgumentList.Arguments)
.SelectMany(o => o)
Expand All @@ -231,35 +236,8 @@ private static CompilationUnitSyntax FixTypeNamingWhenNameEqualsMemberName(
.Concat(genericTypes)
.ToArray();

var identifiersFromIdentifiers = types
.OfType<IdentifierNameSyntax>()
.Where(o => changedClasses.ContainsKey(o.Identifier.Text))
.ToArray();

var identifiersFromArray = types
.OfType<ArrayTypeSyntax>()
.Select(o => o.ElementType)
.OfType<IdentifierNameSyntax>()
.ToArray();

var identifiersFromNullable = types
.OfType<NullableTypeSyntax>()
.Select(o => o.ElementType)
.OfType<IdentifierNameSyntax>()
.ToArray();

var arrayFromNullable = types
.OfType<NullableTypeSyntax>()
.Select(o => o.ElementType)
.OfType<ArrayTypeSyntax>()
.Select(o => o.ElementType)
.OfType<IdentifierNameSyntax>()
.ToArray();

var identifies = identifiersFromIdentifiers
.Concat(identifiersFromArray)
.Concat(identifiersFromNullable)
.Concat(arrayFromNullable)
var identifies = types
.SelectMany(GetIdentifiers)
.Where(o => changedClasses.ContainsKey(o.Identifier.Text))
.ToArray();

Expand All @@ -273,6 +251,17 @@ private static CompilationUnitSyntax FixTypeNamingWhenNameEqualsMemberName(
return unit;
}

private static IdentifierNameSyntax[] GetIdentifiers(TypeSyntax? typeSyntax)
{
return typeSyntax switch
{
IdentifierNameSyntax identifierNameSyntax => [identifierNameSyntax],
ArrayTypeSyntax arrayTypeSyntax => GetIdentifiers(arrayTypeSyntax.ElementType),
NullableTypeSyntax nullableTypeSyntax => GetIdentifiers(nullableTypeSyntax.ElementType),
_ => Array.Empty<IdentifierNameSyntax>()
};
}

private static string SubstringGenericName(string name)
{
var index = name.IndexOf('<');
Expand Down

0 comments on commit aac1317

Please sign in to comment.