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?
Bunu kullanarak ek açıklamaları yapmak mümkün olması gerektiğine inanıyoruz. – svick