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 sorgulayabilirvar 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.
SyntaxTree.GetRoot() SyntaxTree', "SyntaxTree" ile aynıdır – SLaks
Yapmaya çalıştığınız şeyin bana açık değil. Sorunuzu genişletebilir misiniz? –
@JeroenVannevel Soruyu genişlettim. Umarım şimdi daha açıktır. Önerin için teşekkürler. –