/// <summary> /// Performs final merging of old and new class, then triggers template engine to generate the code. /// </summary> /// <returns>Result to check for errors.</returns> public CodeGeneratorResult GenerateCode() { if (!config.IgnoreExistingCode) { if (existingClass != null && !existingClass.IsEmpty()) { string msg = string.Format("Animator state or parameter is no longer valid{0}. Refactor your code to not contain any references.", (config.KeepObsoleteMembers ? "" : " and will be removed in the next code generation")); existingClass.AddAttributeToAllMembers(new ObsoleteAttributeCodeElement(msg, false)); List <MemberCodeElement> allMembers = newClass.GetAllMembers(); newClass.MergeMethods(existingClass, (element) => !allMembers.Contains(element)); newClass.MergeProperties(existingClass, (element) => !allMembers.Contains(element)); newClass.MergeFields(existingClass, (element) => !allMembers.Contains(element)); } } FileCodeElement fileElement = new FileCodeElement(newClass); fileElement.Usings.Add(new UsingCodeElement("UnityEngine")); CodeGeneratorResult result = templateEngine.GenerateCode(fileElement); if (result.Success) { code = templateEngine.Code; } return(result); }
private bool GenerateCode(IList <string> sources, bool useViewEngine, int iterations, bool dump = false) { if (useViewEngine) { for (var i = 0; i < sources.Count; i++) { var source = sources[i]; var relativePath = source.Substring(BasePath.Length).Replace('\\', '/'); Console.WriteLine($"Creating view {relativePath}"); for (var j = 0; j < iterations; j++) { var view = ViewEngine.GetView(null, relativePath, isMainPage: true); view.EnsureSuccessful(new string[0]); GC.KeepAlive(view.View); if (j > 0 && j % 10 == 0) { Console.WriteLine($"Completed iteration {j}"); } } } } else { for (var i = 0; i < sources.Count; i++) { var source = sources[i]; var fileName = Path.GetFileName(source); var fileNameNoExtension = Path.GetFileNameWithoutExtension(source); Console.WriteLine($"Generating {source}"); using (var stream = new FileStream(source, FileMode.Open)) { for (var j = 0; j < iterations; j++) { var result = TemplateEngine.GenerateCode( stream, className: fileNameNoExtension, rootNamespace: "Test", sourceFileName: fileName); if (!result.Success) { Console.WriteLine($"Code generation failed for {source}"); foreach (var error in result.ParserErrors) { Console.WriteLine("\t" + error); } return(false); } if (j > 0 && j % 10 == 0) { Console.WriteLine($"Completed iteration {j}"); } if (dump && j == iterations - 1) { var output = Path.ChangeExtension(source, ".cs"); Console.WriteLine($"Dumping generated code to {output}"); File.WriteAllText(output, result.GeneratedCode); } } stream.Seek(0L, SeekOrigin.Begin); } } } return(true); }