Ejemplo n.º 1
0
        private AssemblyGenerator buildGenerator(GenerationRules generation)
        {
            var generator = new AssemblyGenerator();

            generator.ReferenceAssembly(GetType().Assembly);
            generator.ReferenceAssembly(typeof(Task).Assembly);

            foreach (var assembly in generation.Assemblies)
            {
                generator.ReferenceAssembly(assembly);
            }

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

            var assemblies = GeneratedTypes
                             .SelectMany(x => x.AssemblyReferences())
                             .Distinct().ToArray();

            assemblies
            .Each(x => generator.ReferenceAssembly(x));

            return(generator);
        }
Ejemplo n.º 2
0
        public static void InitializeSynchronously(this ICodeFile file, GenerationRules rules, ICodeFileCollection parent, IServiceProvider?services)
        {
            var @namespace = parent.ToNamespace(rules);

            if (rules.TypeLoadMode == TypeLoadMode.Dynamic)
            {
                Console.WriteLine($"Generated code for {parent.ChildNamespace}.{file.FileName}");

                var generatedAssembly = parent.StartAssembly(rules);
                file.AssembleTypes(generatedAssembly);
                var serviceVariables = services?.GetService(typeof(IServiceVariableSource)) as IServiceVariableSource;

                var compiler = new AssemblyGenerator();
                compiler.Compile(generatedAssembly, serviceVariables);
                file.AttachTypesSynchronously(rules, generatedAssembly.Assembly, services, @namespace);

                return;
            }

            var found = file.AttachTypesSynchronously(rules, rules.ApplicationAssembly, services, @namespace);

            if (found)
            {
                Console.WriteLine($"Types from code file {parent.ChildNamespace}.{file.FileName} were loaded from assembly {rules.ApplicationAssembly.GetName()}");
            }

            if (!found)
            {
                if (rules.TypeLoadMode == TypeLoadMode.Static)
                {
                    throw new ExpectedTypeMissingException(
                              $"Could not load expected pre-built types for code file {file.FileName} ({file})");
                }

                var generatedAssembly = parent.StartAssembly(rules);
                file.AssembleTypes(generatedAssembly);
                var serviceVariables = services?.GetService(typeof(IServiceVariableSource)) as IServiceVariableSource;


                var compiler = new AssemblyGenerator();
                compiler.Compile(generatedAssembly, serviceVariables);

                file.AttachTypesSynchronously(rules, generatedAssembly.Assembly, services, @namespace);

                if (rules.SourceCodeWritingEnabled)
                {
                    var code = compiler.Code;
                    file.WriteCodeFile(parent, rules, code);
                }

                Console.WriteLine($"Generated and compiled code in memory for {parent.ChildNamespace}.{file.FileName}");
            }
        }
Ejemplo n.º 3
0
 public GeneratedAssembly(GenerationRules generation)
 {
     Generation = generation;
 }
Ejemplo n.º 4
0
 public GeneratedType(GenerationRules rules, string typeName)
 {
     Rules    = rules;
     TypeName = typeName;
 }
Ejemplo n.º 5
0
 public static void WriteCodeFile(this ICodeFile file, ICodeFileCollection parent, GenerationRules rules, string code)
 {
     try
     {
         var directory = parent.ToExportDirectory(rules.GeneratedCodeOutputPath);
         var fileName  = Path.Combine(directory, file.FileName.Replace(" ", "_") + ".cs");
         File.WriteAllText(fileName, code);
         Console.WriteLine("Generated code to " + fileName.ToFullPath());
     }
     catch (Exception e)
     {
         Console.WriteLine("Unable to write code file");
         Console.WriteLine(e.ToString());
     }
 }