예제 #1
0
        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());
        }
예제 #2
0
        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);
        }