public static string GenerateHeader(TypeDescription type, List <TypeDescription> types, Dictionary <string, TypeGeneratedCode> allGeneratedTypeContent, Bundle bundle) { var allTopLevelTypes = Types.SortTopLevelTypesTopologically(type, types, bundle); var typeNamespaces = Text.GetNamespaceFromTypeName(type.QualifiedName); var requiredIncludes = Types.GetRequiredTypeIncludes(type, bundle).Select(inc => $"#include \"{string.Concat(Enumerable.Repeat("../", type.QualifiedName.Count(c => c == '.')))}{inc}\""); var allNestedEnums = Types.GetRecursivelyNestedEnums(type); var enumDefs = allNestedEnums.Select(enumDef => EnumGenerator.GenerateEnum(Types.GetTypeClassName(enumDef.QualifiedName, bundle), enumDef, bundle).Replace($"enum {enumDef.Name}", $"class {enumDef.Name}_{enumDef.Name}")); var builder = new StringBuilder(); builder.AppendLine($@"// Generated by {UnrealGenerator.GeneratorTitle} #pragma once #include ""CoreMinimal.h"" #include ""Utils/SchemaOption.h"" #include <WorkerSDK/improbable/c_schema.h> #include <WorkerSDK/improbable/c_worker.h> #include ""{string.Concat(Enumerable.Repeat("../", type.QualifiedName.Count(c => c == '.')))}{HelperFunctions.HeaderPath}"" "); if (requiredIncludes.Count() > 0) { builder.AppendLine(string.Join(Environment.NewLine, requiredIncludes)); builder.AppendLine(); } builder.AppendLine(string.Join(Environment.NewLine, typeNamespaces.Select(t => $"namespace {t} {{"))); builder.AppendLine(); if (allTopLevelTypes.Count() > 1) { builder.AppendLine(string.Join(Environment.NewLine, allTopLevelTypes.Select(topLevelType => $"class {Types.GetTypeClassName(topLevelType.QualifiedName, bundle)};"))); builder.AppendLine(); } if (allNestedEnums.Count() > 0) { builder.AppendLine(string.Join(Environment.NewLine, enumDefs)); builder.AppendLine(); } builder.AppendLine($@"{string.Join(Environment.NewLine, allTopLevelTypes.Select(topLevelType => GenerateTypeClass(Types.GetTypeClassName(topLevelType.QualifiedName, bundle), types.Find(t => t.QualifiedName == topLevelType.QualifiedName), types, bundle)))} {string.Join(Environment.NewLine, allTopLevelTypes.Select(nestedType => GenerateHashFunction(Types.GetTypeClassName(nestedType.QualifiedName, bundle))))} {string.Join(Environment.NewLine, typeNamespaces.Reverse().Select(t => $"}} // namespace {t}"))} "); return(builder.ToString()); }
public List <GeneratedFile> GenerateFiles(Bundle bundle) { var generatedFiles = new List <GeneratedFile>(); var allGeneratedTypeContent = new Dictionary <string, TypeGeneratedCode>(); var types = bundle.Types.Select(kv => new TypeDescription(kv.Key, bundle)) .Union(bundle.Components.Select(kv => new TypeDescription(kv.Key, bundle))) .ToList(); var topLevelTypes = types.Where(type => type.OuterType.Equals("")); var topLevelEnums = bundle.Enums.Where(_enum => _enum.Value.OuterType.Equals("")); // Generate utility files generatedFiles.AddRange(HelperFunctions.GetHelperFunctionFiles()); generatedFiles.AddRange(MapEquals.GenerateMapEquals()); // Generate external schema interface generatedFiles.AddRange(InterfaceGenerator.GenerateInterface(types.Where(type => type.ComponentId.HasValue).ToList(), bundle)); // Generated all type file content foreach (var toplevelType in topLevelTypes) { generatedFiles.Add(new GeneratedFile(Types.TypeToHeaderFilename(toplevelType.QualifiedName), HeaderGenerator.GenerateHeader(toplevelType, types, allGeneratedTypeContent, bundle))); generatedFiles.Add(new GeneratedFile(Types.TypeToSourceFilename(toplevelType.QualifiedName), SourceGenerator.GenerateSource(toplevelType, types, allGeneratedTypeContent, bundle))); } // Add enum files to generated files, ignoring nested enum which are defined in parent files foreach (KeyValuePair <string, EnumDefinition> topLevelEnum in topLevelEnums) { generatedFiles.Add(new GeneratedFile(Types.TypeToHeaderFilename(topLevelEnum.Key), EnumGenerator.GenerateTopLevelEnum(topLevelEnum.Value, bundle))); } return(generatedFiles); }