in telemetry/csharp/AwsToolkit.Telemetry.Events.Generator.Core/DefinitionsBuilder.cs [96:155]
public string Build()
{
if (string.IsNullOrWhiteSpace(_namespace))
{
throw new MissingFieldException("Namespace not provided");
}
var blankNamespace = new CodeNamespace(); // Used for top level Using statements
var generatedNamespace = new CodeNamespace(_namespace); // Where generated classes, types, etc are added to
var generatedCode = new CodeCompileUnit();
generatedCode.Namespaces.Add(blankNamespace);
generatedCode.Namespaces.Add(generatedNamespace);
// Add a top level comment
blankNamespace.Comments.Add(new CodeCommentStatement("--------------------------------------------------------------------------------", true));
blankNamespace.Comments.Add(new CodeCommentStatement("This file is generated from https://github.com/aws/aws-toolkit-common/tree/main/telemetry", true));
blankNamespace.Comments.Add(new CodeCommentStatement("--------------------------------------------------------------------------------", true));
// Set up top level using statements
blankNamespace.Imports.Add(new CodeNamespaceImport("System"));
blankNamespace.Imports.Add(new CodeNamespaceImport("System.Collections.Generic"));
// All generated code is expected to be placed in, or somewhere with a dependency on,
// AwsToolkit.Telemetry.Events.Generated
if (_namespace != Constants.DefaultEventsNamespace)
{
blankNamespace.Imports.Add(new CodeNamespaceImport(Constants.DefaultEventsNamespace));
}
blankNamespace.Imports.Add(new CodeNamespaceImport("Amazon.AwsToolkit.Telemetry.Events.Core"));
// "public sealed partial class ToolkitTelemetryEvent" (contains generated code the toolkit uses to record metrics)
var telemetryEventsClass = new CodeTypeDeclaration()
{
Name = "ToolkitTelemetryEvent",
IsClass = true,
IsPartial = true,
TypeAttributes = TypeAttributes.Public
};
telemetryEventsClass.Comments.Add(new CodeCommentStatement("Contains methods to record telemetry events", true));
generatedNamespace.Types.Add(telemetryEventsClass);
ProcessMetricTypes(generatedNamespace);
ProcessMetrics(telemetryEventsClass, generatedNamespace);
// Output generated code to a string
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CodeGeneratorOptions options = new CodeGeneratorOptions
{
BracingStyle = "C",
BlankLinesBetweenMembers = true
};
using (var writer = new StringWriter())
{
provider.GenerateCodeFromCompileUnit(generatedCode, writer, options);
return writer.ToString()
// XXX: CodeDom does not support static class generation. Post processing to accomplish this.
.Replace($"public partial class {telemetryEventsClass.Name}", $"public static partial class {telemetryEventsClass.Name}");
}
}