public ComponentVisualElementJob(CodegenJobOptions options, IFileSystem fileSystem, DetailsStore detailsStore) : base(options.AsEditor(), fileSystem, detailsStore) { const string jobName = nameof(ComponentVisualElementJob); Logger.Trace($"Initialising {jobName}."); Logger.Trace($"Adding job target for {DebugAsmdefFileName}"); AddJobTarget(Path.Combine(relativeOutputPath, DebugAsmdefFileName), () => DebugAssemblyGenerator.Generate()); var componentsToGenerate = detailsStore.Components.Values.ToList(); var componentGenerator = new ComponentVisualElementGenerator(detailsStore); AddGenerators(relativeOutputPath, componentsToGenerate, component => ($"{component.Name}Renderer.cs", componentGenerator.Generate)); Logger.Trace($"Added job targets for {componentsToGenerate.Count} components"); // Types Logger.Trace("Gathering nested types."); var allNestedTypes = detailsStore.Types .SelectMany(kv => detailsStore.GetNestedTypes(kv.Key)) .ToHashSet(); Logger.Trace("Gathering types details."); var typesToGenerate = detailsStore.Types .Where(kv => !allNestedTypes.Contains(kv.Key)) .Select(kv => kv.Value) .ToList(); var typeGenerator = new TypeVisualElementGenerator(detailsStore); AddGenerators(relativeOutputPath, typesToGenerate, type => ($"{type.Name}Renderer.cs", typeGenerator.Generate)); Logger.Trace($"Added job targets for {typesToGenerate.Count} types"); }
public GameObjectCodegenJob(CodegenJobOptions options, IFileSystem fileSystem, DetailsStore store) : base(options, fileSystem, store) { const string jobName = nameof(GameObjectCodegenJob); Logger.Trace($"Initialising {jobName}."); AddInputFiles(store.SchemaFiles); var componentsToGenerate = store.Components.Values.ToList(); AddGenerators(componentsToGenerate, c => ($"{c.Name}ComponentReaderWriter.cs", UnityComponentReaderWriterGenerator.Generate)); Logger.Trace($"Added job targets for {componentsToGenerate.Count} components."); var componentsWithCommands = componentsToGenerate.Where(c => c.CommandDetails.Count > 0).ToList(); AddGenerators(componentsWithCommands, c => ($"{c.Name}CommandSenderReceiver.cs", UnityCommandSenderReceiverGenerator.Generate)); Logger.Trace($"Added job targets for {componentsWithCommands.Count} components with commands."); Logger.Trace($"Finished initialising {jobName}."); }
public WorkerGenerationJob(CodegenJobOptions options, IFileSystem fileSystem, DetailsStore detailsStore) : base(options.AsEditor(), fileSystem, detailsStore) { const string jobName = nameof(WorkerGenerationJob); Logger.Trace($"Initialising {jobName}."); var workerTypesToGenerate = ExtractWorkerTypes(CodeGeneratorOptions.Instance.WorkerJsonDirectory); Logger.Trace($"Adding job target {WorkerFileName}."); AddJobTarget(Path.Combine(relativeEditorPath, WorkerFileName), () => UnityWorkerMenuGenerator.Generate(workerTypesToGenerate)); Logger.Trace($"Adding job target for {BuildSystemFileName}."); AddJobTarget(Path.Combine(relativeEditorPath, BuildSystemFileName), () => BuildSystemAssemblyGenerator.Generate()); Logger.Trace($"Adding job target for {WorkerListFileName}."); AddJobTarget(Path.Combine(relativeOutputPath, WorkerListFileName), () => string.Join(Environment.NewLine, workerTypesToGenerate)); Logger.Trace($"Finished initialising {jobName}."); }
public CodegenStub(CodegenJobOptions options, IFileSystem fileSystem, DetailsStore detailsStore) : base(options, fileSystem, detailsStore) { MyFileSystem = (MockFileSystem)fileSystem; }
public CoreCodegenJob(CodegenJobOptions options, IFileSystem fileSystem, DetailsStore store) : base(options, fileSystem, store) { const string jobName = nameof(CoreCodegenJob); Logger.Trace($"Initialising {jobName}."); AddInputFiles(store.SchemaFiles); // Types Logger.Trace("Gathering nested types."); var allNestedTypes = store.Types .SelectMany(kv => store.GetNestedTypes(kv.Key)) .ToHashSet(); Logger.Trace("Gathering types details."); var typesToGenerate = store.Types .Where(kv => !allNestedTypes.Contains(kv.Key)) .Select(kv => kv.Value) .ToList(); Logger.Trace("Adding job targets for types."); AddGenerators(typesToGenerate, t => ($"{t.Name}.cs", UnityTypeGenerator.Generate)); Logger.Trace($"Added job targets for {typesToGenerate.Count} types."); // Enums Logger.Trace("Gathering enum details."); var enumsToGenerate = store.Enums .Where(kv => !allNestedTypes.Contains(kv.Key)) .Select(kv => kv.Value) .ToList(); Logger.Trace("Adding job targets for enums."); AddGenerators(enumsToGenerate, e => ($"{e.Name}.cs", UnityEnumGenerator.Generate)); Logger.Trace($"Added job targets for {enumsToGenerate.Count} enums."); // Components Logger.Trace("Gathering component details."); var componentsToGenerate = store.Components.Values.ToList(); Logger.Trace("Adding job targets for components."); AddGenerators(componentsToGenerate, c => ($"{c.Name}.cs", UnityComponentDataGenerator.Generate), c => ($"{c.Name}ReplicationSystem.cs", UnityComponentReplicationSystemGenerator.Generate), c => ($"{c.Name}EcsViewManager.cs", UnityEcsViewManagerGenerator.Generate), c => ($"{c.Name}ComponentDiffStorage.cs", ComponentDiffStorageGenerator.Generate), c => ($"{c.Name}ComponentDiffDeserializer.cs", ComponentDiffDeserializerGenerator.Generate), c => ($"{c.Name}Metaclass.cs", MetaclassGenerator.Generate)); Logger.Trace("Adding job targets for commands."); AddGenerators(componentsToGenerate.Where(c => c.CommandDetails.Count > 0), c => ($"{c.Name}CommandPayloads.cs", UnityCommandPayloadGenerator.Generate), c => ($"{c.Name}CommandDiffDeserializer.cs", CommandDiffDeserializerGenerator.Generate), c => ($"{c.Name}CommandDiffStorage.cs", CommandDiffStorageGenerator.Generate), c => ($"{c.Name}CommandMetaDataStorage.cs", CommandMetaDataStorageGenerator.Generate)); Logger.Trace("Adding job targets for events."); AddGenerators(componentsToGenerate.Where(c => c.EventDetails.Count > 0), c => ($"{c.Name}Events.cs", UnityEventGenerator.Generate)); Logger.Trace($"Added job targets for {componentsToGenerate.Count} components."); Logger.Trace($"Finished initialising {jobName}."); }
public int Run() { if (options.ShouldShowHelp) { ShowHelpMessage(); return(0); } var optionErrors = options.GetValidationErrors().ToList(); foreach (var optionError in optionErrors) { Console.WriteLine(optionError); } if (optionErrors.Any()) { ShowHelpMessage(); return(1); } logger.Info("Starting code generation."); logger.Info("Gathering schema information."); var bundlePath = GenerateBundle(); logger.Trace("Loading schema bundle from json."); var schemaBundle = SchemaBundle.LoadBundle(File.ReadAllText(bundlePath)); logger.Trace("Setting up schema file tree."); var fileTree = new FileTree(options.SchemaInputDirs); logger.Info("Initialising DetailsStore."); var store = new DetailsStore(schemaBundle, options.SerializationOverrides, fileTree); var codegenOptions = new CodegenJobOptions(options.OutputDirectory, options.EditorOutputDirectory, options.Force); logger.Trace("Setting up code generation jobs."); var jobs = AppDomain.CurrentDomain .GetAssemblies() .SelectMany(assembly => { try { return(assembly.GetTypes()); } catch (ReflectionTypeLoadException e) { logger.Error(e, $"Failed to load assembly {assembly.FullName}."); return(Enumerable.Empty <Type>()); } }) .Where(type => typeof(CodegenJob).IsAssignableFrom(type)) .Where(type => !type.IsAbstract) .Where(type => !type.GetCustomAttributes(typeof(IgnoreCodegenJobAttribute)).Any()) .Select(type => { logger.Info($"Creating instance of {type}."); return((CodegenJob)Activator.CreateInstance(type, codegenOptions, fileSystem, store)); }) .ToArray(); logger.Info("Calling JobRunner."); new JobRunner(fileSystem).Run(jobs); logger.Info("Finished code generation."); return(0); }