2015-06-05 10 views
26

Ich habe die folgende Zusammenstellung:Wie wird die Kompilierung mit dem neuen Syntaxbaum teilweise aktualisiert?

Solution solutionToAnalyze = workspace.OpenSolutionAsync(pathToSolution).Result; 
var projects = solutionToAnalyze.Projects; 
Compilation compilation = projects.First().GetCompilationAsync().Result; 
var syntaxTrees = compilation.SyntaxTrees.First(); 
var semanticModel = compilation.GetSemanticModel(syntaxTree, true); 
SyntaxNode newSource = semanticModel.SyntaxTree.GetRoot(); 
var methodRefactoringVisitor = new MethodRefactoringVisitor(); 

ich den Körper eines

public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax method) 
{ 
    var newBody = method.Body; 
    //modify newBody 
    var updatedMethod = method.ReplaceNode(method.Body, newBody); 
    return updatedMethod; 
} 

newSource = methodRefactoringVisitor.Visit(newSource); 

Methode geändert haben, nachdem ich die Änderungen an dem Verfahren vorgenommen, würde Ich mag die Zusammenstellung aktualisieren, so dass zum Beispiel ich kann für den Typ eines Knotens abfragen:

var typeInfo = semanticModel.GetTypeInfo(node).Type; 

im Moment tue ich:

var oldSyntaxTree = semanticModel.SyntaxTree; 
var newSyntaxTree = newSource.SyntaxTree; 
var newCompilation = compilation.ReplaceSyntaxTree(oldSyntaxTree, newSyntaxTree); 
var newSemanticModel = newCompilation.GetSemanticModel(newSyntaxTree); 

Ich möchte die Kompilierung direkt aktualisieren, nachdem ich den Körper geändert habe, so dass ich die Änderungen sehen kann, wenn ich den Besucher von der Elternklasse der modifizierten Methode aufrufen.

Kann die Übersetzung teilweise aktualisiert werden, ohne das gesamte Projekt/die ganze Klasse zu kompilieren?

aktualisieren

Wenn ich richtig verstanden habe, ich glaube nicht, es ist möglich. Auf der FAQ-Seite auf Roslyn Github heißt es:

Kann ich Quellcode in der Compiler-Pipeline neu schreiben?

Roslyn bietet keine ein Plug-in-Architektur in der gesamten Compiler-Pipeline, so dass Sie in jeder Phase analysiert Affekt Syntax, semantische Analyse, Optimierungsalgorithmen, Code Emission usw. [...] Sie können Roslyn, um Code zu analysieren und semantisch zu analysieren, und dann die Bäume neu zu schreiben, Referenzen usw. zu ändern. Dann kompilieren Sie das Ergebnis als eine neue Zusammenstellung.

+0

'SyntaxTree.GetRoot(). SyntaxTree' ist das gleiche wie' SyntaxTree' – SLaks

+1

Es ist unklar, was Sie zu tun versuchen. Kannst du auf deine Frage eingehen? –

+0

@JeroenVannevel Ich habe die Frage erweitert. Ich hoffe, jetzt ist es klarer. Danke für den Vorschlag. –

Antwort

1

Ist es möglich, die Kompilierung teilweise zu aktualisieren, ohne das gesamte Projekt/die ganze Klasse zu kompilieren?

      Nein, die SyntaxTree als ImmutableArray umgesetzt. Sie erstellen also einen neuen SyntaxTree, ohne den alten zu ändern, und müssen den neuen SyntaxTree in ähnlicher Weise in eine neue Compilation übersetzen.
      Sie können das Compilation- oder SemanticModel-Objekt mit dem neuen überschreiben, wenn dies den Code leichter verständlich macht, aber unter der Haube erstellen Sie jedes Mal, wenn Sie einen Knoten ersetzen, eine neue Instanz des Syntaxbaums haben Sie, so scheint Ihre aktuelle Vorgehensweise angemessen.
      Keine große Sache, ich würde es nicht zu sehr stören. Waren Sie nur besorgt über die Leistung oder den besten Ansatz oder ...?

Verwandte Themen