Skip to content

Commit 983faa0

Browse files
authored
Adds resolver compiler source generator. (#7137)
1 parent 08453b5 commit 983faa0

File tree

86 files changed

+2156
-439
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+2156
-439
lines changed

src/HotChocolate/Core/src/Execution/DependencyInjection/InternalSchemaServiceCollectionExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ internal static IServiceCollection TryAddDiagnosticEvents(
3939
});
4040
return services;
4141
}
42-
42+
4343
public static T GetApplicationService<T>(this IServiceProvider services) where T : notnull
4444
=> services.GetApplicationServices().GetRequiredService<T>();
4545

src/HotChocolate/Core/src/Execution/DependencyInjection/RequestExecutorServiceCollectionExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using HotChocolate.Execution.Options;
1010
using HotChocolate.Execution.Processing;
1111
using HotChocolate.Fetching;
12+
using HotChocolate.Internal;
1213
using HotChocolate.Language;
1314
using HotChocolate.Resolvers;
1415
using Microsoft.Extensions.DependencyInjection.Extensions;
@@ -38,6 +39,7 @@ public static IServiceCollection AddGraphQLCore(this IServiceCollection services
3839
services.TryAddSingleton<DefaultRequestContextAccessor>();
3940
services.TryAddSingleton<IRequestContextAccessor>(sp => sp.GetRequiredService<DefaultRequestContextAccessor>());
4041
services.TryAddSingleton<AggregateServiceScopeInitializer>();
42+
services.TryAddSingleton<IParameterBindingResolver, DefaultParameterBindingResolver>();
4143

4244
services.TryAddSingleton<ObjectPool<StringBuilder>>(sp =>
4345
{

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public DataLoaderSyntaxGenerator()
1818
_writer = new CodeWriter(_sb);
1919
}
2020

21-
public void WriterHeader()
21+
public void WriteHeader()
2222
{
2323
_writer.WriteFileHeader();
2424
_writer.WriteIndentedLine("using Microsoft.Extensions.DependencyInjection;");
@@ -91,7 +91,7 @@ public void WriteBeginDataLoaderClass(
9191
key.ToFullyQualified(),
9292
value.ToFullyQualified());
9393
break;
94-
94+
9595
case DataLoaderKind.Group:
9696
_writer.WriteIndentedLine(
9797
": global::GreenDonut.GroupedDataLoader<{0}, {1}>",
@@ -298,4 +298,4 @@ public void Dispose()
298298
_writer = default!;
299299
_disposed = true;
300300
}
301-
}
301+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public ModuleSyntaxGenerator(string moduleName, string ns)
2020
_writer = new CodeWriter(_sb);
2121
}
2222

23-
public void WriterHeader()
23+
public void WriteHeader()
2424
{
2525
_writer.WriteFileHeader();
2626
_writer.WriteLine();

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

Lines changed: 63 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,24 @@
11
using System.Text;
22
using HotChocolate.Types.Analyzers.Helpers;
33
using HotChocolate.Types.Analyzers.Inspectors;
4+
using Microsoft.CodeAnalysis;
45

56
namespace HotChocolate.Types.Analyzers.Generators;
67

7-
public sealed class ObjectTypeExtensionSyntaxGenerator
8+
public sealed class ObjectTypeExtensionSyntaxGenerator(StringBuilder sb, string ns)
89
{
9-
private readonly string _ns;
10-
private readonly CodeWriter _writer;
10+
private readonly CodeWriter _writer = new(sb);
1111

12-
public ObjectTypeExtensionSyntaxGenerator(StringBuilder sb, string ns)
13-
{
14-
_ns = ns;
15-
_writer = new(sb);
16-
}
17-
18-
public void WriterHeader()
12+
public void WriteHeader()
1913
{
2014
_writer.WriteFileHeader();
15+
_writer.WriteIndentedLine("using Microsoft.Extensions.DependencyInjection;");
2116
_writer.WriteLine();
2217
}
2318

2419
public void WriteBeginNamespace()
2520
{
26-
_writer.WriteIndentedLine("namespace {0}", _ns);
21+
_writer.WriteIndentedLine("namespace {0}", ns);
2722
_writer.WriteIndentedLine("{");
2823
_writer.IncreaseIndent();
2924
}
@@ -58,14 +53,17 @@ public void WriteInitializeMethod(ObjectTypeExtensionInfo objectTypeExtension)
5853

5954
using (_writer.IncreaseIndent())
6055
{
61-
_writer.WriteIndentedLine("const global::System.Reflection.BindingFlags bindingFlags =");
62-
using (_writer.IncreaseIndent())
56+
if (objectTypeExtension.Members.Length > 0)
6357
{
64-
_writer.WriteIndentedLine("global::System.Reflection.BindingFlags.Public |");
58+
_writer.WriteIndentedLine("const global::{0} bindingFlags =", WellKnownTypes.BindingFlags);
6559
using (_writer.IncreaseIndent())
6660
{
67-
_writer.WriteIndentedLine("System.Reflection.BindingFlags.NonPublic |");
68-
_writer.WriteIndentedLine("System.Reflection.BindingFlags.Static;");
61+
_writer.WriteIndentedLine("global::{0}.Public", WellKnownTypes.BindingFlags);
62+
using (_writer.IncreaseIndent())
63+
{
64+
_writer.WriteIndentedLine("| global::{0}.NonPublic", WellKnownTypes.BindingFlags);
65+
_writer.WriteIndentedLine("| global::{0}.Static;", WellKnownTypes.BindingFlags);
66+
}
6967
}
7068
}
7169

@@ -89,17 +87,62 @@ public void WriteInitializeMethod(ObjectTypeExtensionInfo objectTypeExtension)
8987

9088
if (objectTypeExtension.Members.Length > 0)
9189
{
92-
_writer.WriteLine();
9390
foreach (var member in objectTypeExtension.Members)
9491
{
95-
_writer.WriteIndentedLine(
96-
"descriptor.Field(thisType.GetMember(\"{0}\", bindingFlags)[0]);",
97-
member.Name);
92+
_writer.WriteLine();
93+
_writer.WriteIndentedLine("descriptor");
94+
95+
using (_writer.IncreaseIndent())
96+
{
97+
_writer.WriteIndentedLine(
98+
".Field(thisType.GetMember(\"{0}\", bindingFlags)[0])",
99+
member.Name);
100+
101+
if (member is IMethodSymbol method &&
102+
method.GetResultKind() is not ResolverResultKind.Pure)
103+
{
104+
_writer.WriteIndentedLine(
105+
".Extend().Definition.Resolver = {0}Resolvers.{1}_{2};",
106+
objectTypeExtension.Type.ToDisplayString(),
107+
objectTypeExtension.Type.Name,
108+
member.Name);
109+
}
110+
else
111+
{
112+
_writer.WriteIndentedLine(
113+
".Extend().Definition.PureResolver = {0}Resolvers.{1}_{2};",
114+
objectTypeExtension.Type.ToDisplayString(),
115+
objectTypeExtension.Type.Name,
116+
member.Name);
117+
}
118+
}
98119
}
99120
}
100121

101122
_writer.WriteLine();
102123
_writer.WriteIndentedLine("Configure(descriptor);");
124+
125+
if (objectTypeExtension.Members.Length > 0)
126+
{
127+
_writer.WriteLine();
128+
_writer.WriteIndentedLine("descriptor.Extend().Context.OnSchemaCreated(");
129+
using (_writer.IncreaseIndent())
130+
{
131+
_writer.WriteIndentedLine("schema =>");
132+
_writer.WriteIndentedLine("{");
133+
using (_writer.IncreaseIndent())
134+
{
135+
_writer.WriteIndentedLine("var services = schema.Services.GetApplicationServices();");
136+
_writer.WriteIndentedLine(
137+
"var bindingResolver = services.GetRequiredService<global::{0}>();",
138+
WellKnownTypes.ParameterBindingResolver);
139+
_writer.WriteIndentedLine(
140+
"global::{0}Resolvers.InitializeBindings(bindingResolver);",
141+
objectTypeExtension.Type.ToDisplayString());
142+
}
143+
_writer.WriteIndentedLine("});");
144+
}
145+
}
103146
}
104147

105148
_writer.WriteIndentedLine("}");

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public OperationFieldSyntaxGenerator()
1818
_writer = new CodeWriter(_sb);
1919
}
2020

21-
public void WriterHeader()
21+
public void WriteHeader()
2222
{
2323
_writer.WriteFileHeader();
2424
_writer.WriteLine();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public RequestMiddlewareSyntaxGenerator(string moduleName, string ns)
2525
_writer = new(_sb);
2626
}
2727

28-
public void WriterHeader()
28+
public void WriteHeader()
2929
{
3030
_writer.WriteFileHeader();
3131
_writer.WriteIndentedLine("using Microsoft.Extensions.DependencyInjection;");
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using Microsoft.CodeAnalysis;
2+
3+
namespace HotChocolate.Types.Analyzers.Generators;
4+
5+
public readonly struct ResolverName(string typeName, string memberName)
6+
{
7+
public readonly string TypeName = typeName;
8+
9+
public readonly string MemberName = memberName;
10+
}
11+
12+
public readonly struct ResolverInfo(ResolverName resolverName, IMethodSymbol? methodSymbol)
13+
{
14+
public readonly ResolverName Name = resolverName;
15+
16+
public readonly IMethodSymbol? Method = methodSymbol;
17+
18+
public readonly int ParameterCount = methodSymbol?.Parameters.Length ?? 0;
19+
20+
public readonly bool Skip =>
21+
ParameterCount == 0 ||
22+
(ParameterCount == 1 && (Method?.Parameters[0]?.IsParent() ?? false));
23+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace HotChocolate.Types.Analyzers.Generators;
2+
3+
public enum ResolverResultKind
4+
{
5+
Task,
6+
Executable,
7+
Queryable,
8+
AsyncEnumerable,
9+
TaskAsyncEnumerable,
10+
Pure,
11+
Invalid
12+
}

0 commit comments

Comments
 (0)