public string Build()

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}");
            }
        }