Пример #1
0
        /// <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);
        }
Пример #2
0
        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);
        }