static void Main(string project, string[] transformers) { AnalyzerManager manager = new AnalyzerManager(); ProjectAnalyzer analyzer = manager.GetProject(project); AdhocWorkspace workspace = new AdhocWorkspace(); analyzer.SetGlobalProperty("BuildingFromCodeGeneration", "true"); var Project = analyzer.AddToWorkspace(workspace, true); if (Project is null) { throw new ArgumentException($"Project is null. ({project})"); } var resolver = new CSharpAutofacResolver(); var Engine = new CSharpCodeGenerationEngine(Project, resolver); foreach (var item in transformers) { var assembly = LoadAssembly(item); var transformer = LoadTransformer(assembly, Engine); transformer.Transform(); } var changes = Engine.CurrentProject.GetChanges(Project); Procces(Engine, project, changes.GetAddedDocuments(), "Added"); var changedDocs = changes.GetChangedDocuments(false).Where(x => Engine.CurrentProject.GetDocument(x).GetTextChangesAsync(Project.GetDocument(x)).Result.Any()); Procces(Engine, project, changedDocs, "Updated"); }
private static void Procces(CSharpCodeGenerationEngine engine, string project, IEnumerable <DocumentId> docs, string status) { foreach (var docId in docs) { var doc = engine.CurrentProject.GetDocument(docId); var text = doc.GetSyntaxRootAsync().Result.NormalizeWhitespace().ToFullString();//TODO: make async var relativePath = Path.IsPathRooted(doc.FilePath)?Path.GetRelativePath(Path.GetDirectoryName(project), doc.FilePath) :doc.FilePath; var newPath = Path.Combine(Path.GetDirectoryName(project), "obj", "Transformers", "CSharp", relativePath); Directory.CreateDirectory(Path.GetDirectoryName(newPath)); File.WriteAllText(newPath, text); Console.WriteLine(new TaskData() { Kind = "Compile", FilePath = relativePath, Status = status } +";"); } }
private static CodeGenerationTransformer LoadTransformer(Assembly assembly, CSharpCodeGenerationEngine Engine) { var type = assembly.GetTypes().First(x => x.IsSubclassOf(typeof(CodeGenerationTransformer)));//TODO: Why only one transformer by assembly if (type is null) { throw new ArgumentException($"There is no transformer on assembly {assembly.FullName}."); } var transformer = Activator.CreateInstance(type); if (transformer is null) { throw new ArgumentException($"Cant get instance of {type.Name}."); } CodeGenerationTransformer trans = transformer as CodeGenerationTransformer; trans.Engine = Engine; return(transformer as CodeGenerationTransformer); }
public CommandTests(ITestOutputHelper output, TestDocumentEditingCodeGenerationEngine engine) { this.output = output; this.engine = engine; }