Пример #1
0
        public void CompileAll(ICompileStrategy compileStrategy)
        {
            var generator = new AssemblyGenerator(compileStrategy);

            foreach (var assemblyReference in this._assemblies)
            {
                generator.ReferenceAssembly(assemblyReference);
            }

            foreach (var generatedType in this.GeneratedTypes)
            {
                foreach (var x in generatedType.AssemblyReferences())
                {
                    generator.ReferenceAssembly(x);
                }

                // We generate the code for the type upfront as we allow adding namespaces etc. during the rendering of
                // frames so we need to do those, and _then_ gather namespaces
                // A rough estimate of 3000 characters per method with 2 being used, plus 1000 for ctor.
                var typeWriter = new SourceWriter((3000 * 2) + 1000);
                generatedType.Write(typeWriter);

                var namespaces = generatedType
                                 .AllInjectedFields
                                 .Select(x => x.VariableType.Namespace)
                                 .Concat(new[] { typeof(Task).Namespace })
                                 .Concat(generatedType.Namespaces)
                                 .Distinct()
                                 .ToList();

                var writer = new SourceWriter();

                writer.Comment("<auto-generated />");
                writer.Comment(generatedType.TypeName);
                writer.BlankLine();

                foreach (var ns in namespaces.OrderBy(x => x))
                {
                    writer.UsingNamespace(ns);
                }

                writer.BlankLine();

                writer.Namespace(generatedType.Namespace);

                writer.WriteLines(typeWriter.Code());

                writer.FinishBlock();

                var code = writer.Code();

                generatedType.SourceCode = code;
                generator.AddFile($"{generatedType.Namespace.Replace(".", "/")}/{generatedType.TypeName}.cs", code);
            }

            var assembly = generator.Generate(this._generationRules);

            var generated = assembly.GetExportedTypes().ToArray();

            foreach (var generatedType in this.GeneratedTypes)
            {
                generatedType.FindType(generated);
            }
        }