コード例 #1
0
        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");
        }
コード例 #2
0
 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
         } +";");
     }
 }
コード例 #3
0
        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);
        }
コード例 #4
0
 public CommandTests(ITestOutputHelper output, TestDocumentEditingCodeGenerationEngine engine)
 {
     this.output = output;
     this.engine = engine;
 }