示例#1
0
        /// <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);
        }
示例#2
0
        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}.");
                }
            }
        }