Skip to content

Commit fdf48d5

Browse files
committed
Fixes various analyzer issues related to paging. (#8148)
1 parent 6705830 commit fdf48d5

File tree

38 files changed

+2550
-220
lines changed

38 files changed

+2550
-220
lines changed

src/HotChocolate/Core/src/Types.Analyzers/FileBuilders/TypeFileBuilderBase.cs

+87-37
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,15 @@ protected void WriteResolverField(Resolver resolver)
251251

252252
public virtual void WriteResolverConstructor(IOutputTypeInfo type, ILocalTypeLookup typeLookup)
253253
{
254+
var resolverType =
255+
type.SchemaSchemaType
256+
?? type.RuntimeType
257+
?? throw new InvalidOperationException("Schema type and runtime type are null.");
258+
254259
WriteResolverConstructor(
255260
type,
256261
typeLookup,
257-
type.Resolvers[0].Member.ContainingType.ToFullyQualified(),
262+
resolverType.ToFullyQualified(),
258263
type.Resolvers.Any(t => t.RequiresParameterBindings));
259264
}
260265

@@ -697,19 +702,19 @@ private void WriteResolverArguments(Resolver resolver, IMethodSymbol resolverMet
697702
break;
698703

699704
case ResolverParameterKind.GetGlobalState when parameter.Parameter.HasExplicitDefaultValue:
700-
{
701-
var defaultValue = parameter.Parameter.ExplicitDefaultValue;
702-
var defaultValueString = GeneratorUtils.ConvertDefaultValueToString(defaultValue, parameter.Type);
705+
{
706+
var defaultValue = parameter.Parameter.ExplicitDefaultValue;
707+
var defaultValueString = GeneratorUtils.ConvertDefaultValueToString(defaultValue, parameter.Type);
703708

704-
Writer.WriteIndentedLine(
705-
"var args{0} = context.GetGlobalStateOrDefault<{1}{2}>(\"{3}\", {4});",
706-
i,
707-
parameter.Type.ToFullyQualified(),
708-
parameter.Type.IsNullableRefType() ? "?" : string.Empty,
709-
parameter.Key,
710-
defaultValueString);
711-
break;
712-
}
709+
Writer.WriteIndentedLine(
710+
"var args{0} = context.GetGlobalStateOrDefault<{1}{2}>(\"{3}\", {4});",
711+
i,
712+
parameter.Type.ToFullyQualified(),
713+
parameter.Type.IsNullableRefType() ? "?" : string.Empty,
714+
parameter.Key,
715+
defaultValueString);
716+
break;
717+
}
713718

714719
case ResolverParameterKind.GetGlobalState when !parameter.IsNullable:
715720
Writer.WriteIndentedLine(
@@ -737,19 +742,19 @@ private void WriteResolverArguments(Resolver resolver, IMethodSymbol resolverMet
737742
break;
738743

739744
case ResolverParameterKind.GetScopedState when parameter.Parameter.HasExplicitDefaultValue:
740-
{
741-
var defaultValue = parameter.Parameter.ExplicitDefaultValue;
742-
var defaultValueString = GeneratorUtils.ConvertDefaultValueToString(defaultValue, parameter.Type);
745+
{
746+
var defaultValue = parameter.Parameter.ExplicitDefaultValue;
747+
var defaultValueString = GeneratorUtils.ConvertDefaultValueToString(defaultValue, parameter.Type);
743748

744-
Writer.WriteIndentedLine(
745-
"var args{0} = context.GetScopedStateOrDefault<{1}{2}>(\"{3}\", {4});",
746-
i,
747-
parameter.Type.ToFullyQualified(),
748-
parameter.Type.IsNullableRefType() ? "?" : string.Empty,
749-
parameter.Key,
750-
defaultValueString);
751-
break;
752-
}
749+
Writer.WriteIndentedLine(
750+
"var args{0} = context.GetScopedStateOrDefault<{1}{2}>(\"{3}\", {4});",
751+
i,
752+
parameter.Type.ToFullyQualified(),
753+
parameter.Type.IsNullableRefType() ? "?" : string.Empty,
754+
parameter.Key,
755+
defaultValueString);
756+
break;
757+
}
753758

754759
case ResolverParameterKind.GetScopedState when !parameter.IsNullable:
755760
Writer.WriteIndentedLine(
@@ -777,19 +782,19 @@ private void WriteResolverArguments(Resolver resolver, IMethodSymbol resolverMet
777782
break;
778783

779784
case ResolverParameterKind.GetLocalState when parameter.Parameter.HasExplicitDefaultValue:
780-
{
781-
var defaultValue = parameter.Parameter.ExplicitDefaultValue;
782-
var defaultValueString = GeneratorUtils.ConvertDefaultValueToString(defaultValue, parameter.Type);
785+
{
786+
var defaultValue = parameter.Parameter.ExplicitDefaultValue;
787+
var defaultValueString = GeneratorUtils.ConvertDefaultValueToString(defaultValue, parameter.Type);
783788

784-
Writer.WriteIndentedLine(
785-
"var args{0} = context.GetLocalStateOrDefault<{1}{2}>(\"{3}\", {4});",
786-
i,
787-
parameter.Type.ToFullyQualified(),
788-
parameter.Type.IsNullableRefType() ? "?" : string.Empty,
789-
parameter.Key,
790-
defaultValueString);
791-
break;
792-
}
789+
Writer.WriteIndentedLine(
790+
"var args{0} = context.GetLocalStateOrDefault<{1}{2}>(\"{3}\", {4});",
791+
i,
792+
parameter.Type.ToFullyQualified(),
793+
parameter.Type.IsNullableRefType() ? "?" : string.Empty,
794+
parameter.Key,
795+
defaultValueString);
796+
break;
797+
}
793798

794799
case ResolverParameterKind.GetLocalState when !parameter.IsNullable:
795800
Writer.WriteIndentedLine(
@@ -947,7 +952,52 @@ private void WriteResolverArguments(Resolver resolver, IMethodSymbol resolverMet
947952

948953
Writer.WriteIndentedLine("};");
949954
}
955+
break;
956+
957+
case ResolverParameterKind.ConnectionFlags:
958+
Writer.WriteIndentedLine(
959+
"var args{0} = global::{1}.Nothing;",
960+
i,
961+
WellKnownTypes.ConnectionFlags);
962+
Writer.WriteLine();
963+
964+
Writer.WriteIndentedLine(
965+
"if(context.IsSelected(\"edges\"))");
966+
Writer.WriteIndentedLine("{");
967+
using (Writer.IncreaseIndent())
968+
{
969+
Writer.WriteIndentedLine(
970+
"args{0} |= global::{1}.Edges;",
971+
i,
972+
WellKnownTypes.ConnectionFlags);
973+
}
974+
Writer.WriteIndentedLine("}");
975+
Writer.WriteLine();
976+
977+
Writer.WriteIndentedLine(
978+
"if(context.IsSelected(\"nodes\"))");
979+
Writer.WriteIndentedLine("{");
980+
using (Writer.IncreaseIndent())
981+
{
982+
Writer.WriteIndentedLine(
983+
"args{0} |= global::{1}.Nodes;",
984+
i,
985+
WellKnownTypes.ConnectionFlags);
986+
}
987+
Writer.WriteIndentedLine("}");
988+
Writer.WriteLine();
950989

990+
Writer.WriteIndentedLine(
991+
"if(context.IsSelected(\"totalCount\"))");
992+
Writer.WriteIndentedLine("{");
993+
using (Writer.IncreaseIndent())
994+
{
995+
Writer.WriteIndentedLine(
996+
"args{0} |= global::{1}.TotalCount;",
997+
i,
998+
WellKnownTypes.ConnectionFlags);
999+
}
1000+
Writer.WriteIndentedLine("}");
9511001
break;
9521002

9531003
case ResolverParameterKind.Unknown:

src/HotChocolate/Core/src/Types.Analyzers/Generators/DataLoaderGenerator.cs

+7-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using HotChocolate.Types.Analyzers.Inspectors;
55
using HotChocolate.Types.Analyzers.Models;
66
using Microsoft.CodeAnalysis;
7+
using Microsoft.CodeAnalysis.Text;
78

89
namespace HotChocolate.Types.Analyzers.Generators;
910

@@ -12,16 +13,17 @@ public sealed class DataLoaderGenerator : ISyntaxGenerator
1213
public void Generate(
1314
SourceProductionContext context,
1415
string assemblyName,
15-
ImmutableArray<SyntaxInfo> syntaxInfos)
16+
ImmutableArray<SyntaxInfo> syntaxInfos,
17+
Action<string, SourceText> addSource)
1618
{
1719
var dataLoaderDefaults = syntaxInfos.GetDataLoaderDefaults();
18-
WriteDataLoader(context, syntaxInfos, dataLoaderDefaults);
20+
WriteDataLoader(syntaxInfos, dataLoaderDefaults, addSource);
1921
}
2022

2123
private static void WriteDataLoader(
22-
SourceProductionContext context,
2324
ImmutableArray<SyntaxInfo> syntaxInfos,
24-
DataLoaderDefaultsInfo defaults)
25+
DataLoaderDefaultsInfo defaults,
26+
Action<string, SourceText> addSource)
2527
{
2628
var dataLoaders = new List<DataLoaderInfo>();
2729

@@ -122,7 +124,7 @@ private static void WriteDataLoader(
122124

123125
if (hasDataLoaders)
124126
{
125-
context.AddSource(WellKnownFileNames.DataLoaderFile, generator.ToSourceText());
127+
addSource(WellKnownFileNames.DataLoaderFile, generator.ToSourceText());
126128
}
127129
}
128130

src/HotChocolate/Core/src/Types.Analyzers/Generators/DataLoaderModuleGenerator.cs

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using HotChocolate.Types.Analyzers.Helpers;
44
using HotChocolate.Types.Analyzers.Models;
55
using Microsoft.CodeAnalysis;
6+
using Microsoft.CodeAnalysis.Text;
67

78
namespace HotChocolate.Types.Analyzers.Generators;
89

@@ -11,7 +12,8 @@ public sealed class DataLoaderModuleGenerator : ISyntaxGenerator
1112
public void Generate(
1213
SourceProductionContext context,
1314
string assemblyName,
14-
ImmutableArray<SyntaxInfo> syntaxInfos)
15+
ImmutableArray<SyntaxInfo> syntaxInfos,
16+
Action<string, SourceText> addSource)
1517
{
1618
var module = GetDataLoaderModuleInfo(syntaxInfos);
1719
var dataLoaderDefaults = syntaxInfos.GetDataLoaderDefaults();
@@ -71,7 +73,7 @@ public void Generate(
7173
generator.WriteEndClass();
7274
generator.WriteEndNamespace();
7375

74-
context.AddSource(WellKnownFileNames.DataLoaderModuleFile, generator.ToSourceText());
76+
addSource(WellKnownFileNames.DataLoaderModuleFile, generator.ToSourceText());
7577
}
7678

7779
private static DataLoaderModuleInfo? GetDataLoaderModuleInfo(

src/HotChocolate/Core/src/Types.Analyzers/Generators/DefaultLocalTypeLookup.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ namespace HotChocolate.Types.Analyzers.Generators;
99
public sealed class DefaultLocalTypeLookup(ImmutableArray<SyntaxInfo> syntaxInfos) : ILocalTypeLookup
1010
{
1111
private Dictionary<string, List<string>>? _typeNameLookup;
12-
private readonly ImmutableArray<SyntaxInfo> _syntaxInfos = syntaxInfos;
1312

1413
public bool TryGetTypeName(
1514
ITypeSymbol type,
@@ -48,7 +47,7 @@ private Dictionary<string, List<string>> GetTypeNameLookup()
4847
if (_typeNameLookup is null)
4948
{
5049
_typeNameLookup = new Dictionary<string, List<string>>();
51-
foreach (var syntaxInfo in _syntaxInfos)
50+
foreach (var syntaxInfo in syntaxInfos)
5251
{
5352
if(syntaxInfo is not DataLoaderInfo dataLoaderInfo)
5453
{
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Collections.Immutable;
22
using HotChocolate.Types.Analyzers.Models;
33
using Microsoft.CodeAnalysis;
4+
using Microsoft.CodeAnalysis.Text;
45

56
namespace HotChocolate.Types.Analyzers.Generators;
67

@@ -9,5 +10,6 @@ public interface ISyntaxGenerator
910
void Generate(
1011
SourceProductionContext context,
1112
string assemblyName,
12-
ImmutableArray<SyntaxInfo> syntaxInfos);
13+
ImmutableArray<SyntaxInfo> syntaxInfos,
14+
Action<string, SourceText> addSource);
1315
}

src/HotChocolate/Core/src/Types.Analyzers/Generators/MiddlewareGenerator.cs

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using HotChocolate.Types.Analyzers.Helpers;
44
using HotChocolate.Types.Analyzers.Models;
55
using Microsoft.CodeAnalysis;
6+
using Microsoft.CodeAnalysis.Text;
67

78
namespace HotChocolate.Types.Analyzers.Generators;
89

@@ -13,7 +14,8 @@ public sealed class MiddlewareGenerator : ISyntaxGenerator
1314
public void Generate(
1415
SourceProductionContext context,
1516
string assemblyName,
16-
ImmutableArray<SyntaxInfo> syntaxInfos)
17+
ImmutableArray<SyntaxInfo> syntaxInfos,
18+
Action<string, SourceText> addSource)
1719
{
1820
if (syntaxInfos.IsEmpty)
1921
{
@@ -63,6 +65,6 @@ public void Generate(
6365

6466
generator.WriteEndNamespace();
6567

66-
context.AddSource(WellKnownFileNames.MiddlewareFile, generator.ToSourceText());
68+
addSource(WellKnownFileNames.MiddlewareFile, generator.ToSourceText());
6769
}
6870
}

0 commit comments

Comments
 (0)