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); }
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}"); } }
public GeneratedAssembly(GenerationRules generation) { Generation = generation; }
public GeneratedType(GenerationRules rules, string typeName) { Rules = rules; TypeName = typeName; }
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()); } }