/// <summary> /// Generate code based on inputs and print to output files. /// </summary> /// <param name="inputDefs">Paths for source files.</param> /// <param name="outputPath">Location to store output files.</param> /// <param name="outputFileBasename">The basename used for all the output files.</param> public static void GenerateCode(string[] inputDefs, string outputPath, string outputFileBasename) { CodeGenCSharpCompiler compiler = new CodeGenCSharpCompiler(); CompilerOutput compilerOutput = compiler.CompileFromFiles(inputDefs, outputPath); CodeCommentsReader codeComments = compilerOutput.CodeComments; Compilation compilation = compilerOutput.Compilation; Assembly sourceTypesAssembly = compilerOutput.Assembly; // Store C# compiler, used later to compute codegen type hash. // TypeMetadataMapper.Compilation = compilerOutput.Compilation; MultiCodeWriter codeWriter = GetMainCodeWriter(sourceTypesAssembly); var codeGenErrors = new List <CodegenError>(); bool result = GenerateTypes(codeWriter, compilation, codeComments, codeGenErrors, sourceTypesAssembly); if (!result || codeGenErrors.Any()) { PrintCodeGenErrorsAndExit(codeGenErrors); } if (!Directory.Exists(outputPath)) { Directory.CreateDirectory(outputPath); } WriteOutputToFile(codeWriter, outputFileBasename, outputPath); }
private static void WriteOutputToFile(MultiCodeWriter codeWriter, string outputFileBasename, string outputPath) { // Write results to file(s). // Each entry contains a key (file prefix), and the value (StringBuilder with generated code). // foreach (var entry in codeWriter.GetOutput()) { // To support incremental build, check to see if the output has changed before committing it its file. // string outputFileName = outputFileBasename + entry.Key; string outputFilePath = Path.Combine(outputPath, outputFileName); string outputString = entry.Value.ToString(); if (!File.Exists(outputFilePath) || File.ReadAllText(outputFilePath) != outputString) { Console.WriteLine($"Writing changes to {outputFilePath}."); File.WriteAllText(outputFilePath, outputString); } else { Console.WriteLine($"No changes to {outputFilePath}."); } } }