我目前正在使用 Roslyn 对语法树进行三向合并。我在一个节点上的所有子节点之间都有一个匹配ClassDeclerationSyntax
,并且想要对子节点执行合并,然后基于该合并创建一个新树。
O 是输入ClassDeclerationSyntax
,匹配有三个类型的成员(A,O,B)MemberDeclerationSyntax
。
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);
}
这不起作用。在第二次迭代中ReplaceNode
返回一个完全未修改的节点(oldUpdated == updated
is true
)。
似乎在循环的第一次迭代之后,所有子对象都已被重建为新对象,而我匹配中存储的原始子对象对象不再可以在子列表中找到(updated.ChildNodes().Where(x => x == m.O)
为空)。
这样做的好方法是什么?