2015-06-05 16 views
26

Aşağıdaki derleme var: Ben yönteme değişiklikleri yaptıktan sonraDerleme yeni sözdizimi ağacıyla kısmen nasıl güncelleştirilir?

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(); 

Ben bir yönteme

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); 

gövdesini modifiye ettim, derleme güncellemek istiyorum böylece örneğin Ben yapıyorum anda

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

:

bir düğüm türü için sorgulayabilir
var oldSyntaxTree = semanticModel.SyntaxTree; 
var newSyntaxTree = newSource.SyntaxTree; 
var newCompilation = compilation.ReplaceSyntaxTree(oldSyntaxTree, newSyntaxTree); 
var newSemanticModel = newCompilation.GetSemanticModel(newSyntaxTree); 

Derlemeyi değiştirdikten hemen sonra güncellemeyi güncellemek istiyorum, böylece ziyaretçiyi değiştirilen yöntemin üst sınıfından çağırıyorsam değişiklikleri görebilirim.

Tüm projeyi/sınıfı derlemeden derlemeyi kısmen güncelleştirmek mümkün mü? Eğer doğru anladıysam

Güncelleme

, mümkün olduğunu sanmıyorum. Roslyn github hakkındaki SSS sayfasında:

Kaynak kodunu derleyici boru hattında yeniden yazabilir miyim? bir eklenti mimarisi derleyici boru hattı boyunca her aşamada size çözümlenen söz dizimi de etkileyebileceğini, anlamsal analiz, optimizasyon algoritmaları, kod emisyon vs. yüzden [...] kullanabilirsiniz

Roslyn sağlamaz Roslyn kodunu ayrıştırmak ve semantik olarak analiz etmek ve ardından ağaçları yeniden yazmak, referansları değiştirmek vb. Sonrasında yeni bir derleme olarak sonucu derlemek.

+0

SyntaxTree.GetRoot() SyntaxTree', "SyntaxTree" ile aynıdır – SLaks

+1

Yapmaya çalıştığınız şeyin bana açık değil. Sorunuzu genişletebilir misiniz? –

+0

@JeroenVannevel Soruyu genişlettim. Umarım şimdi daha açıktır. Önerin için teşekkürler. –

cevap

1

kısmen tüm proje/sınıf derleme olmadan derleme güncelleştirmek mümkün mü?

      Hayır

, SyntaxTree bir ImmutableArray olarak uygulanmaktadır. Böylece, aslında yeni bir SyntaxTree oluşturuyorsunuz, eski olanı değiştirmiyorsunuz ve benzer şekilde yeni SyntaxTree'yi yeni bir derlemede derlemeniz gerekecek.
Sen bir düğüm ya da ne değiştirmek Derleme üzerine yazabilirsiniz veya bu konuda ikna etmeye kod kolaylaştırır ise yenisi ile itiraz SemanticModel ama başlık altında, sen sözdizimi ağacının yeni bir örneğe her zaman yaratıyor       Sizde mevcut yaklaşımınız uygun görünüyor.
      Önemli değil, sizi çok rahatsız etmesine izin vermezdim. Performanstan mı yoksa en iyi yaklaşımdan mı endişe ediyordun?

İlgili konular