Skip to content

Commit fcc4a00

Browse files
authored
Remove generic builder pattern from element metadata creation (Part 1) (#1842)
This is part of what will probably be a few PRs to replace the generic builder pattern in use for defining element metadata. This causes a lot of JITing to occur and causes the ballooning of AOT builds.
1 parent 7738889 commit fcc4a00

File tree

184 files changed

+135784
-67175
lines changed

Some content is hidden

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

184 files changed

+135784
-67175
lines changed

Directory.Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<PackageVersion Include="BenchmarkDotNet" Version="0.14.0" />
55
<PackageVersion Include="BenchmarkDotNet.Diagnostics.Windows" Version="0.14.0" />
66
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
7+
<PackageVersion Include="Microsoft.Bcl.Memory" Version="9.0.0" />
78
<PackageVersion Include="Microsoft.DotNet.BuildTools.GenAPI" Version="3.0.0-preview4-06015-01" />
89
<PackageVersion Include="Microsoft.CodeAnalysis" Version="4.11.0" />
910
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />

gen/DocumentFormat.OpenXml.Generator.Models/Editor/TextWriterExtensions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ public static void WriteItem<T>(this TextWriter writer, T item, bool isConstant
128128
{
129129
writer.WriteString(item.ToString());
130130
}
131+
else if (typeof(T) == typeof(TypedQName))
132+
{
133+
writer.WriteString(item.ToString());
134+
}
131135
else if (typeof(T) == typeof(string))
132136
{
133137
writer.WriteString((string)(object)item, isConstant);

gen/DocumentFormat.OpenXml.Generator.Models/Generators/Elements/DataModelWriterExtensions.cs

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
using DocumentFormat.OpenXml.Generator.Models;
66
using DocumentFormat.OpenXml.Generator.Schematron;
77
using System.CodeDom.Compiler;
8+
using System.Runtime.CompilerServices;
89
using System.Text;
10+
using System.Xml.Linq;
911

1012
namespace DocumentFormat.OpenXml.Generator.Generators.Elements;
1113

@@ -169,6 +171,22 @@ private static string GetBaseName(SchemaType type)
169171
return type.BaseClass;
170172
}
171173

174+
private static void WriteTypeDetails(this IndentedTextWriter writer, OpenXmlGeneratorServices services, SchemaType element)
175+
{
176+
// Since some types will not be shadowing an existing static type, it's easier to just disable the warning
177+
writer.WriteLine("#pragma warning disable CS0109");
178+
writer.Write("internal static readonly new OpenXmlQualifiedName ElementQName = ");
179+
writer.WriteQName(services, element.Name.QName);
180+
writer.WriteLine(";");
181+
182+
writer.Write("internal static readonly new OpenXmlQualifiedName ElementTypeName = ");
183+
writer.WriteQName(services, element.Name.Type);
184+
writer.WriteLine(";");
185+
186+
writer.WriteLine("internal static readonly new OpenXmlSchemaType ElementType = new(ElementQName, ElementTypeName);");
187+
writer.WriteLine("#pragma warning restore CS0109");
188+
}
189+
172190
private static void WriteType(this IndentedTextWriter writer, OpenXmlGeneratorServices services, SchemaType element)
173191
{
174192
writer.WriteDocumentationComment(BuildTypeComments(services, element));
@@ -205,6 +223,10 @@ private static void WriteType(this IndentedTextWriter writer, OpenXmlGeneratorSe
205223
var delimiter = writer.TrackDelimiter(separator: string.Empty, newLineCount: 2);
206224

207225
delimiter.AddDelimiter();
226+
227+
writer.WriteTypeDetails(services, element);
228+
writer.WriteLineNoTabs();
229+
208230
writer.WriteDocumentationComment($"Initializes a new instance of the {className} class.");
209231
writer.Write(element.GetAccessibility());
210232
writer.Write(" ");
@@ -324,9 +346,7 @@ private static void WriteMetadata(this IndentedTextWriter writer, OpenXmlGenerat
324346

325347
if (!containingType.Name.QName.IsEmpty)
326348
{
327-
writer.Write("builder.SetSchema(");
328-
writer.WriteItem(containingType.Name.QName);
329-
writer.WriteLine(");");
349+
writer.WriteLine("builder.SetSchema(ElementType);");
330350
}
331351

332352
if (!containingType.IsAbstract && containingType.Version > OfficeVersion.Office2007)
@@ -472,14 +492,36 @@ private static void WriteElement(this IndentedTextWriter writer, OpenXmlGenerato
472492

473493
using (writer.AddBlock(new() { IncludeTrailingNewline = false }))
474494
{
475-
writer.Write("get => GetElement<");
495+
writer.Write("get => GetElement(");
476496
writer.Write(className);
477-
writer.WriteLine(">();");
497+
writer.Write(".ElementType) as ");
498+
writer.Write(className);
499+
writer.WriteLine(";");
478500

479-
writer.WriteLine("set => SetElement(value);");
501+
writer.Write("set => SetElement(value, ");
502+
writer.Write(className);
503+
writer.WriteLine(".ElementType);");
480504
}
481505
}
482506

507+
private static void WriteQName(this IndentedTextWriter writer, OpenXmlGeneratorServices services, QName qname)
508+
{
509+
writer.Write("new(");
510+
writer.WriteString(services.GetNamespaceInfo(qname.Prefix).Uri);
511+
writer.Write(", ");
512+
writer.WriteString(qname.Name);
513+
writer.Write(")");
514+
}
515+
516+
internal static void WriteTypedName(this IndentedTextWriter writer, OpenXmlGeneratorServices services, TypedQName typed)
517+
{
518+
writer.Write("new(");
519+
writer.WriteQName(services, typed.Type);
520+
writer.Write(", ");
521+
writer.WriteQName(services, typed.QName);
522+
writer.Write(")");
523+
}
524+
483525
private static void WriteAttributeProperty(this IndentedTextWriter writer, OpenXmlGeneratorServices services, SchemaAttribute attribute, List<string>? attributeStrings = null)
484526
{
485527
var remarks = default(string);

gen/DocumentFormat.OpenXml.Generator.Models/Generators/Elements/ParticleWriterExtensions.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,11 @@ private static void WriteItemNode(this IndentedTextWriter writer, OpenXmlGenerat
9696
if (particle.Kind == ParticleType.Element)
9797
{
9898
var info = services.FindClassName(particle.Name);
99-
writer.WriteObject("ElementParticle", particle, w => w.WriteItem(new TypeOf(info)));
99+
writer.WriteObject("ElementParticle", particle, w =>
100+
{
101+
w.Write(info);
102+
w.Write(".ElementType");
103+
});
100104
}
101105
else if (particle.Kind == ParticleType.Any)
102106
{

0 commit comments

Comments
 (0)