Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
<PackageVersion Include="BenchmarkDotNet" Version="0.14.0" />
<PackageVersion Include="BenchmarkDotNet.Diagnostics.Windows" Version="0.14.0" />
<PackageVersion Include="coverlet.collector" Version="6.0.2" />
<PackageVersion Include="Microsoft.Bcl.Memory" Version="9.0.0" />
<PackageVersion Include="Microsoft.DotNet.BuildTools.GenAPI" Version="3.0.0-preview4-06015-01" />
<PackageVersion Include="Microsoft.CodeAnalysis" Version="4.11.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,10 @@ public static void WriteItem<T>(this TextWriter writer, T item, bool isConstant
{
writer.WriteString(item.ToString());
}
else if (typeof(T) == typeof(TypedQName))
{
writer.WriteString(item.ToString());
}
else if (typeof(T) == typeof(string))
{
writer.WriteString((string)(object)item, isConstant);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
using DocumentFormat.OpenXml.Generator.Models;
using DocumentFormat.OpenXml.Generator.Schematron;
using System.CodeDom.Compiler;
using System.Runtime.CompilerServices;
using System.Text;
using System.Xml.Linq;

namespace DocumentFormat.OpenXml.Generator.Generators.Elements;

Expand Down Expand Up @@ -63,6 +65,22 @@ private static string GetBaseName(SchemaType type)
return type.BaseClass;
}

private static void WriteTypeDetails(this IndentedTextWriter writer, OpenXmlGeneratorServices services, SchemaType element)
{
// Since some types will not be shadowing an existing static type, it's easier to just disable the warning
writer.WriteLine("#pragma warning disable CS0109");
writer.Write("internal static readonly new OpenXmlQualifiedName ElementQName = ");
writer.WriteQName(services, element.Name.QName);
writer.WriteLine(";");

writer.Write("internal static readonly new OpenXmlQualifiedName ElementTypeName = ");
writer.WriteQName(services, element.Name.Type);
writer.WriteLine(";");

writer.WriteLine("internal static readonly new OpenXmlSchemaType ElementType = new(ElementQName, ElementTypeName);");
writer.WriteLine("#pragma warning restore CS0109");
}

private static void WriteType(this IndentedTextWriter writer, OpenXmlGeneratorServices services, SchemaType element)
{
writer.WriteDocumentationComment(BuildTypeComments(services, element));
Expand All @@ -85,6 +103,10 @@ private static void WriteType(this IndentedTextWriter writer, OpenXmlGeneratorSe
var delimiter = writer.TrackDelimiter(separator: string.Empty, newLineCount: 2);

delimiter.AddDelimiter();

writer.WriteTypeDetails(services, element);
writer.WriteLineNoTabs();

writer.WriteDocumentationComment($"Initializes a new instance of the {className} class.");
writer.Write(element.GetAccessibility());
writer.Write(" ");
Expand Down Expand Up @@ -187,9 +209,7 @@ private static void WriteMetadata(this IndentedTextWriter writer, OpenXmlGenerat

if (!containingType.Name.QName.IsEmpty)
{
writer.Write("builder.SetSchema(");
writer.WriteItem(containingType.Name.QName);
writer.WriteLine(");");
writer.WriteLine("builder.SetSchema(ElementType);");
}

if (!containingType.IsAbstract && containingType.Version > OfficeVersion.Office2007)
Expand Down Expand Up @@ -327,14 +347,36 @@ private static void WriteElement(this IndentedTextWriter writer, OpenXmlGenerato

using (writer.AddBlock(new() { IncludeTrailingNewline = false }))
{
writer.Write("get => GetElement<");
writer.Write("get => GetElement(");
writer.Write(className);
writer.WriteLine(">();");
writer.Write(".ElementType) as ");
writer.Write(className);
writer.WriteLine(";");

writer.WriteLine("set => SetElement(value);");
writer.Write("set => SetElement(value, ");
writer.Write(className);
writer.WriteLine(".ElementType);");
}
}

private static void WriteQName(this IndentedTextWriter writer, OpenXmlGeneratorServices services, QName qname)
{
writer.Write("new(");
writer.WriteString(services.GetNamespaceInfo(qname.Prefix).Uri);
writer.Write(", ");
writer.WriteString(qname.Name);
writer.Write(")");
}

internal static void WriteTypedName(this IndentedTextWriter writer, OpenXmlGeneratorServices services, TypedQName typed)
{
writer.Write("new(");
writer.WriteQName(services, typed.Type);
writer.Write(", ");
writer.WriteQName(services, typed.QName);
writer.Write(")");
}

private static void WriteAttributeProperty(this IndentedTextWriter writer, OpenXmlGeneratorServices services, SchemaAttribute attribute)
{
var remarks = default(string);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,11 @@ private static void WriteItemNode(this IndentedTextWriter writer, OpenXmlGenerat
if (particle.Kind == ParticleType.Element)
{
var info = services.FindClassName(particle.Name);
writer.WriteObject("ElementParticle", particle, w => w.WriteItem(new TypeOf(info)));
writer.WriteObject("ElementParticle", particle, w =>
{
w.Write(info);
w.Write(".ElementType");
});
}
else if (particle.Kind == ParticleType.Any)
{
Expand Down
Loading
Loading