Skip to content

Commit cb28038

Browse files
authored
Reduced Generated Type Extension Code (#7119)
1 parent ad98734 commit cb28038

File tree

4 files changed

+109
-58
lines changed

4 files changed

+109
-58
lines changed

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

Lines changed: 66 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -80,63 +80,94 @@ public void WriteRegisterTypeExtension(string typeName, bool staticType)
8080

8181
public void WriteRegisterObjectTypeExtension(string runtimeTypeName, string extensionType)
8282
{
83-
_writer.WriteIndentedLine("builder.ConfigureSchema(sb =>", runtimeTypeName);
83+
_writer.WriteIndentedLine(
84+
"AddTypeExtension_8734371<{0}>(builder, {1}.Initialize);",
85+
runtimeTypeName,
86+
extensionType);
87+
}
88+
89+
public void WriteRegisterObjectTypeExtensionHelpers()
90+
{
91+
_writer.WriteLine();
92+
_writer.WriteIndentedLine("private static void AddTypeExtension_8734371<T>(");
93+
94+
using (_writer.IncreaseIndent())
95+
{
96+
_writer.WriteIndentedLine("global::HotChocolate.Execution.Configuration.IRequestExecutorBuilder builder,");
97+
_writer.WriteIndentedLine("Action<IObjectTypeDescriptor<T>> initialize)");
98+
}
99+
84100
_writer.WriteIndentedLine("{");
101+
85102
using (_writer.IncreaseIndent())
86103
{
87-
_writer.WriteIndentedLine("const string typeKey = \"8734371_Type_ObjectType<{0}>\";", runtimeTypeName);
88-
_writer.WriteIndentedLine("const string hooksKey = \"8734371_Hooks_ObjectType<{0}>\";", runtimeTypeName);
89-
_writer.WriteLine();
90-
_writer.WriteIndentedLine("if (!sb.ContextData.ContainsKey(typeKey))");
104+
_writer.WriteIndentedLine("builder.ConfigureSchema(sb =>");
91105
_writer.WriteIndentedLine("{");
106+
92107
using (_writer.IncreaseIndent())
93108
{
94-
_writer.WriteIndentedLine("sb.AddObjectType<{0}>(", runtimeTypeName);
109+
_writer.WriteIndentedLine("string typeName = typeof(T).FullName!;");
110+
_writer.WriteIndentedLine("string typeKey = $\"8734371_Type_ObjectType<{typeName}>\";");
111+
_writer.WriteIndentedLine("string hooksKey = $\"8734371_Hooks_ObjectType<{typeName}>\";");
112+
_writer.WriteLine();
113+
_writer.WriteIndentedLine("if (!sb.ContextData.ContainsKey(typeKey))");
114+
_writer.WriteIndentedLine("{");
115+
95116
using (_writer.IncreaseIndent())
96117
{
97-
_writer.WriteIndentedLine("descriptor =>");
98-
_writer.WriteIndentedLine("{");
118+
_writer.WriteIndentedLine("sb.AddObjectType<T>(");
99119
using (_writer.IncreaseIndent())
100120
{
101-
_writer.WriteIndentedLine(
102-
"var hooks = (global::System.Collections.Generic.List<Action<IObjectTypeDescriptor" +
103-
"<{0}>>>)descriptor.Extend().Context.ContextData[hooksKey]!;",
104-
runtimeTypeName);
105-
_writer.WriteIndentedLine("foreach (var configure in hooks)");
121+
_writer.WriteIndentedLine("descriptor =>");
106122
_writer.WriteIndentedLine("{");
123+
107124
using (_writer.IncreaseIndent())
108125
{
109-
_writer.WriteIndentedLine("configure(descriptor);");
126+
_writer.WriteIndentedLine(
127+
"var hooks = (global::System.Collections.Generic.List<" +
128+
"Action<IObjectTypeDescriptor<T>>>)" +
129+
"descriptor.Extend().Context.ContextData[hooksKey]!;");
130+
_writer.WriteIndentedLine("foreach (var configure in hooks)");
131+
_writer.WriteIndentedLine("{");
132+
133+
using (_writer.IncreaseIndent())
134+
{
135+
_writer.WriteIndentedLine("configure(descriptor);");
136+
}
137+
138+
_writer.WriteIndentedLine("};");
110139
}
111-
_writer.WriteIndentedLine("};");
140+
141+
_writer.WriteIndentedLine("});");
112142
}
113-
_writer.WriteIndentedLine("});");
143+
144+
_writer.WriteIndentedLine("sb.ContextData.Add(typeKey, null);");
114145
}
146+
147+
_writer.WriteIndentedLine("}");
115148
_writer.WriteLine();
116-
_writer.WriteIndentedLine("sb.ContextData.Add(typeKey, null);");
117-
}
118-
_writer.WriteIndentedLine("}");
119149

120-
_writer.WriteLine();
121-
_writer.WriteIndentedLine("if (!sb.ContextData.TryGetValue(hooksKey, out var value))");
122-
_writer.WriteIndentedLine("{");
123-
using (_writer.IncreaseIndent())
124-
{
150+
_writer.WriteIndentedLine("if (!sb.ContextData.TryGetValue(hooksKey, out var value))");
151+
_writer.WriteIndentedLine("{");
152+
153+
using (_writer.IncreaseIndent())
154+
{
155+
_writer.WriteIndentedLine(
156+
"value = new System.Collections.Generic.List<Action<IObjectTypeDescriptor<T>>>();");
157+
_writer.WriteIndentedLine("sb.ContextData.Add(hooksKey, value);");
158+
}
159+
160+
_writer.WriteIndentedLine("}");
161+
_writer.WriteLine();
125162
_writer.WriteIndentedLine(
126-
"value = new System.Collections.Generic.List<Action<IObjectTypeDescriptor<{0}>>>();",
127-
runtimeTypeName);
128-
_writer.WriteIndentedLine("sb.ContextData.Add(hooksKey, value);");
163+
"((System.Collections.Generic.List<Action<IObjectTypeDescriptor<T>>>)value!)" +
164+
".Add(initialize);");
129165
}
130166

131-
_writer.WriteIndentedLine("}");
132-
_writer.WriteLine();
133-
_writer.WriteIndentedLine(
134-
"((System.Collections.Generic.List<Action<IObjectTypeDescriptor<{0}>>>)value!)" +
135-
".Add({1}.Initialize);",
136-
runtimeTypeName,
137-
extensionType);
167+
_writer.WriteIndentedLine("});");
138168
}
139-
_writer.WriteIndentedLine("});");
169+
170+
_writer.WriteIndentedLine("}");
140171
}
141172

142173
public void WriteRegisterDataLoader(string typeName)

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,15 @@ public void WriteInitializeMethod(ObjectTypeExtensionInfo objectTypeExtension)
5858

5959
using (_writer.IncreaseIndent())
6060
{
61-
_writer.WriteIndentedLine("var bindingFlags = System.Reflection.BindingFlags.Public |");
61+
_writer.WriteIndentedLine("const global::System.Reflection.BindingFlags bindingFlags =");
6262
using (_writer.IncreaseIndent())
6363
{
64-
_writer.WriteIndentedLine("System.Reflection.BindingFlags.NonPublic |");
65-
_writer.WriteIndentedLine("System.Reflection.BindingFlags.Static;");
64+
_writer.WriteIndentedLine("global::System.Reflection.BindingFlags.Public |");
65+
using (_writer.IncreaseIndent())
66+
{
67+
_writer.WriteIndentedLine("System.Reflection.BindingFlags.NonPublic |");
68+
_writer.WriteIndentedLine("System.Reflection.BindingFlags.Static;");
69+
}
6670
}
6771

6872
_writer.WriteIndentedLine(

src/HotChocolate/Core/src/Types.Analyzers/TypeModuleGenerator.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,12 @@ private static void WriteConfiguration(
202202
}
203203

204204
generator.WriteEndRegistrationMethod();
205+
206+
if (syntaxInfos.OfType<ObjectTypeExtensionInfo>().Any())
207+
{
208+
generator.WriteRegisterObjectTypeExtensionHelpers();
209+
}
210+
205211
generator.WriteEndClass();
206212
generator.WriteEndNamespace();
207213

src/HotChocolate/Core/src/Types.Analyzers/TypesGenerator.cs

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -69,37 +69,47 @@ private static void Execute(
6969
var sb = StringBuilderPool.Get();
7070
var first = true;
7171

72-
foreach (var syntaxInfo in syntaxInfos)
72+
foreach (var group in syntaxInfos
73+
.OfType<ObjectTypeExtensionInfo>()
74+
.GroupBy(t => t.Type.ContainingNamespace.ToDisplayString()))
7375
{
74-
if (syntaxInfo is not ObjectTypeExtensionInfo objectTypeExtension)
76+
var generator = new ObjectTypeExtensionSyntaxGenerator(sb, group.Key);
77+
78+
if (first)
7579
{
76-
continue;
80+
generator.WriterHeader();
81+
first = false;
7782
}
7883

79-
if (objectTypeExtension.Diagnostics.Length > 0)
84+
generator.WriteBeginNamespace();
85+
86+
var firstClass = true;
87+
88+
foreach (var objectTypeExtension in group)
8089
{
81-
foreach (var diagnostic in objectTypeExtension.Diagnostics)
90+
if (objectTypeExtension.Diagnostics.Length > 0)
8291
{
83-
context.ReportDiagnostic(diagnostic);
92+
foreach (var diagnostic in objectTypeExtension.Diagnostics)
93+
{
94+
context.ReportDiagnostic(diagnostic);
95+
}
96+
97+
continue;
8498
}
85-
continue;
86-
}
8799

88-
var generator = new ObjectTypeExtensionSyntaxGenerator(
89-
sb,
90-
objectTypeExtension.Type.ContainingNamespace.ToDisplayString());
100+
if (!firstClass)
101+
{
102+
sb.AppendLine();
103+
}
104+
firstClass = false;
91105

92-
if (first)
93-
{
94-
generator.WriterHeader();
95-
first = false;
106+
generator.WriteBeginClass(objectTypeExtension.Type.Name);
107+
generator.WriteInitializeMethod(objectTypeExtension);
108+
sb.AppendLine();
109+
generator.WriteConfigureMethod(objectTypeExtension);
110+
generator.WriteEndClass();
96111
}
97112

98-
generator.WriteBeginNamespace();
99-
generator.WriteBeginClass(objectTypeExtension.Type.Name);
100-
generator.WriteInitializeMethod(objectTypeExtension);
101-
generator.WriteConfigureMethod(objectTypeExtension);
102-
generator.WriteEndClass();
103113
generator.WriteEndNamespace();
104114
}
105115

0 commit comments

Comments
 (0)