2013-04-24 11 views
6

kullanarak Roslyn kullanarak sözdizimi ağaçlarında üç yönlü birleştirme üzerinde çalışıyorum. ClassDeclerationSyntax düğümünde tüm çocuklar arasında bir eşleşme var ve çocuklar üzerinde bir birleştirme gerçekleştirmek ve sonra bu birleştirmeye dayalı yeni bir ağaç oluşturmak istiyorum.Aynı ağaçtaki birkaç düğümün değiştirilmesi, SyntaxNode.ReplaceNode

O, ClassDeclerationSyntax girişidir ve eşleşmenin, MemberDeclerationSyntax türünde üç üyesi vardır (A, O, B).

var updated = O; 
foreach (var m in matching) 
{ 
    if (m.A != null && m.B != null && m.O != null) { 
     var merge = Merge(m.A, m.O, m.B); 
     var oldUpdated = updated; 
     updated = updated.ReplaceNode(m.O, merge); 
    } 
    else if (m.A == null && m.O == null && m.B != null) 
     updated = updated.AddMembers(m.B); 
    else if (m.A != null && m.O == null && m.B == null) 
     updated = updated.AddMembers(m.A); 
} 

Bu çalışmaz. İkinci yinelemede ReplaceNode tamamen değiştirilmemiş bir düğümü döndürür (oldUpdated == updated, true).

Döngünün ilk yinelemesinden sonra, tüm çocuklar yeni nesneler olarak yeniden yapılandırıldı ve eşleştirmemde saklanan orijinal çocuk nesneleri artık çocuk listesinde bulunamayacak gibi görünüyor (updated.ChildNodes().Where(x => x == m.O) boş).

Bunu yapmak için iyi bir yol ne olurdu?

+0

Bunu kullanarak ek açıklamaları yapmak mümkün olması gerektiğine inanıyoruz. – svick

cevap

6

Benim şu anki yaklaşım:

var updateMember = new Dictionary<MemberDeclarationSyntax, MemberDeclarationSyntax>(); 
var addMembers = new List<MemberDeclarationSyntax>(); 

foreach (var m in matching) { 
    if (m.A != null && m.B != null && m.O != null) { 
     var mergeChild = Merge(m.A, m.B, M.O); 
     updateMember.Add(m.O, child); 
    } 
    else if (m.A == null && m.O == null && m.B != null) 
     addMembers.Add(m.B); 
    else if (m.A != null && m.O == null && m.B == null) 
     addMembers.Add(m.A); 
} 

var merged = O.ReplaceNodes(updateMember.Keys.AsEnumerable(), (n1, n2) => 
{ 
    return updateMember[n1]; 
}).AddMembers(addMembers.ToArray()); 
+0

Bu doğru bir yaklaşımdır. –

İlgili konular