Skip to content

Commit

Permalink
Reduced Generated Type Extension Code (#7119)
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelstaib committed May 24, 2024
1 parent ad98734 commit cb28038
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 58 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,63 +80,94 @@ public void WriteRegisterTypeExtension(string typeName, bool staticType)

public void WriteRegisterObjectTypeExtension(string runtimeTypeName, string extensionType)
{
_writer.WriteIndentedLine("builder.ConfigureSchema(sb =>", runtimeTypeName);
_writer.WriteIndentedLine(
"AddTypeExtension_8734371<{0}>(builder, {1}.Initialize);",
runtimeTypeName,
extensionType);
}

public void WriteRegisterObjectTypeExtensionHelpers()
{
_writer.WriteLine();
_writer.WriteIndentedLine("private static void AddTypeExtension_8734371<T>(");

using (_writer.IncreaseIndent())
{
_writer.WriteIndentedLine("global::HotChocolate.Execution.Configuration.IRequestExecutorBuilder builder,");
_writer.WriteIndentedLine("Action<IObjectTypeDescriptor<T>> initialize)");
}

_writer.WriteIndentedLine("{");

using (_writer.IncreaseIndent())
{
_writer.WriteIndentedLine("const string typeKey = \"8734371_Type_ObjectType<{0}>\";", runtimeTypeName);
_writer.WriteIndentedLine("const string hooksKey = \"8734371_Hooks_ObjectType<{0}>\";", runtimeTypeName);
_writer.WriteLine();
_writer.WriteIndentedLine("if (!sb.ContextData.ContainsKey(typeKey))");
_writer.WriteIndentedLine("builder.ConfigureSchema(sb =>");
_writer.WriteIndentedLine("{");

using (_writer.IncreaseIndent())
{
_writer.WriteIndentedLine("sb.AddObjectType<{0}>(", runtimeTypeName);
_writer.WriteIndentedLine("string typeName = typeof(T).FullName!;");
_writer.WriteIndentedLine("string typeKey = $\"8734371_Type_ObjectType<{typeName}>\";");
_writer.WriteIndentedLine("string hooksKey = $\"8734371_Hooks_ObjectType<{typeName}>\";");
_writer.WriteLine();
_writer.WriteIndentedLine("if (!sb.ContextData.ContainsKey(typeKey))");
_writer.WriteIndentedLine("{");

using (_writer.IncreaseIndent())
{
_writer.WriteIndentedLine("descriptor =>");
_writer.WriteIndentedLine("{");
_writer.WriteIndentedLine("sb.AddObjectType<T>(");
using (_writer.IncreaseIndent())
{
_writer.WriteIndentedLine(
"var hooks = (global::System.Collections.Generic.List<Action<IObjectTypeDescriptor" +
"<{0}>>>)descriptor.Extend().Context.ContextData[hooksKey]!;",
runtimeTypeName);
_writer.WriteIndentedLine("foreach (var configure in hooks)");
_writer.WriteIndentedLine("descriptor =>");
_writer.WriteIndentedLine("{");

using (_writer.IncreaseIndent())
{
_writer.WriteIndentedLine("configure(descriptor);");
_writer.WriteIndentedLine(
"var hooks = (global::System.Collections.Generic.List<" +
"Action<IObjectTypeDescriptor<T>>>)" +
"descriptor.Extend().Context.ContextData[hooksKey]!;");
_writer.WriteIndentedLine("foreach (var configure in hooks)");
_writer.WriteIndentedLine("{");

using (_writer.IncreaseIndent())
{
_writer.WriteIndentedLine("configure(descriptor);");
}

_writer.WriteIndentedLine("};");
}
_writer.WriteIndentedLine("};");

_writer.WriteIndentedLine("});");
}
_writer.WriteIndentedLine("});");

_writer.WriteIndentedLine("sb.ContextData.Add(typeKey, null);");
}

_writer.WriteIndentedLine("}");
_writer.WriteLine();
_writer.WriteIndentedLine("sb.ContextData.Add(typeKey, null);");
}
_writer.WriteIndentedLine("}");

_writer.WriteLine();
_writer.WriteIndentedLine("if (!sb.ContextData.TryGetValue(hooksKey, out var value))");
_writer.WriteIndentedLine("{");
using (_writer.IncreaseIndent())
{
_writer.WriteIndentedLine("if (!sb.ContextData.TryGetValue(hooksKey, out var value))");
_writer.WriteIndentedLine("{");

using (_writer.IncreaseIndent())
{
_writer.WriteIndentedLine(
"value = new System.Collections.Generic.List<Action<IObjectTypeDescriptor<T>>>();");
_writer.WriteIndentedLine("sb.ContextData.Add(hooksKey, value);");
}

_writer.WriteIndentedLine("}");
_writer.WriteLine();
_writer.WriteIndentedLine(
"value = new System.Collections.Generic.List<Action<IObjectTypeDescriptor<{0}>>>();",
runtimeTypeName);
_writer.WriteIndentedLine("sb.ContextData.Add(hooksKey, value);");
"((System.Collections.Generic.List<Action<IObjectTypeDescriptor<T>>>)value!)" +
".Add(initialize);");
}

_writer.WriteIndentedLine("}");
_writer.WriteLine();
_writer.WriteIndentedLine(
"((System.Collections.Generic.List<Action<IObjectTypeDescriptor<{0}>>>)value!)" +
".Add({1}.Initialize);",
runtimeTypeName,
extensionType);
_writer.WriteIndentedLine("});");
}
_writer.WriteIndentedLine("});");

_writer.WriteIndentedLine("}");
}

public void WriteRegisterDataLoader(string typeName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,15 @@ public void WriteInitializeMethod(ObjectTypeExtensionInfo objectTypeExtension)

using (_writer.IncreaseIndent())
{
_writer.WriteIndentedLine("var bindingFlags = System.Reflection.BindingFlags.Public |");
_writer.WriteIndentedLine("const global::System.Reflection.BindingFlags bindingFlags =");
using (_writer.IncreaseIndent())
{
_writer.WriteIndentedLine("System.Reflection.BindingFlags.NonPublic |");
_writer.WriteIndentedLine("System.Reflection.BindingFlags.Static;");
_writer.WriteIndentedLine("global::System.Reflection.BindingFlags.Public |");
using (_writer.IncreaseIndent())
{
_writer.WriteIndentedLine("System.Reflection.BindingFlags.NonPublic |");
_writer.WriteIndentedLine("System.Reflection.BindingFlags.Static;");
}
}

_writer.WriteIndentedLine(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,12 @@ private static bool IsAssemblyAttributeList(SyntaxNode node)
}

generator.WriteEndRegistrationMethod();

if (syntaxInfos.OfType<ObjectTypeExtensionInfo>().Any())
{
generator.WriteRegisterObjectTypeExtensionHelpers();
}

generator.WriteEndClass();
generator.WriteEndNamespace();

Expand Down
50 changes: 30 additions & 20 deletions src/HotChocolate/Core/src/Types.Analyzers/TypesGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,37 +69,47 @@ private static bool IsAssemblyAttributeList(SyntaxNode node)
var sb = StringBuilderPool.Get();
var first = true;

foreach (var syntaxInfo in syntaxInfos)
foreach (var group in syntaxInfos
.OfType<ObjectTypeExtensionInfo>()
.GroupBy(t => t.Type.ContainingNamespace.ToDisplayString()))
{
if (syntaxInfo is not ObjectTypeExtensionInfo objectTypeExtension)
var generator = new ObjectTypeExtensionSyntaxGenerator(sb, group.Key);

if (first)
{
continue;
generator.WriterHeader();
first = false;
}

if (objectTypeExtension.Diagnostics.Length > 0)
generator.WriteBeginNamespace();

var firstClass = true;

foreach (var objectTypeExtension in group)
{
foreach (var diagnostic in objectTypeExtension.Diagnostics)
if (objectTypeExtension.Diagnostics.Length > 0)
{
context.ReportDiagnostic(diagnostic);
foreach (var diagnostic in objectTypeExtension.Diagnostics)
{
context.ReportDiagnostic(diagnostic);
}

continue;
}
continue;
}

var generator = new ObjectTypeExtensionSyntaxGenerator(
sb,
objectTypeExtension.Type.ContainingNamespace.ToDisplayString());
if (!firstClass)
{
sb.AppendLine();
}
firstClass = false;

if (first)
{
generator.WriterHeader();
first = false;
generator.WriteBeginClass(objectTypeExtension.Type.Name);
generator.WriteInitializeMethod(objectTypeExtension);
sb.AppendLine();
generator.WriteConfigureMethod(objectTypeExtension);
generator.WriteEndClass();
}

generator.WriteBeginNamespace();
generator.WriteBeginClass(objectTypeExtension.Type.Name);
generator.WriteInitializeMethod(objectTypeExtension);
generator.WriteConfigureMethod(objectTypeExtension);
generator.WriteEndClass();
generator.WriteEndNamespace();
}

Expand Down

0 comments on commit cb28038

Please sign in to comment.