public Type[] CompileAll(GenerationRules generation) { var code = GenerateCode(generation); var generator = buildGenerator(generation); var assembly = generator.Generate(code); return(assembly.GetExportedTypes().ToArray()); }
private AssemblyGenerator buildGenerator(GenerationRules generation) { var generator = new AssemblyGenerator(); generator.ReferenceAssembly(GetType().GetTypeInfo().Assembly); generator.ReferenceAssembly(typeof(Task).GetTypeInfo().Assembly); foreach (var assembly in generation.Assemblies) { generator.ReferenceAssembly(assembly); } return(generator); }
public string GenerateCode(GenerationRules generation) { beforeGeneratingCode(); var classes = chains.Select(x => x.ToClass(generation)).ToArray(); var namespaces = classes .SelectMany(x => x.Args()) .Select(x => x.ArgType.Namespace) .Concat(new string[] { typeof(Task).Namespace }) .Distinct().ToList(); var writer = new SourceWriter(); foreach (var ns in namespaces.OrderBy(x => x)) { writer.Write($"using {ns};"); } writer.BlankLine(); writer.Namespace(generation.ApplicationNamespace); foreach (var @class in classes) { writer.WriteLine($"// START: {@class.ClassName}"); @class.Write(writer); writer.WriteLine($"// END: {@class.ClassName}"); writer.WriteLine(""); writer.WriteLine(""); } writer.FinishBlock(); var code = writer.Code(); attachSourceCodeToChains(code); return(code); }
public THandler[] CompileAndBuildAll(GenerationRules generation, Func <Type, object> builder) { var types = CompileAll(generation); return(chains.Select(x => x.Create(types, builder)).ToArray()); }
public GeneratedClass(GenerationRules rules, string className) { Rules = rules; ClassName = className; }