Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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.4" />
<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 @@ -169,6 +171,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 Down Expand Up @@ -205,6 +223,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 @@ -324,9 +346,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 @@ -472,14 +492,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, List<string>? attributeStrings = null)
{
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