Tôi hiện đang làm việc trên cách hợp nhất ba chiều trên cây cú pháp bằng Roslyn. Tôi có một sự kết hợp giữa tất cả trẻ em trên một nút ClassDeclerationSyntax
và muốn thực hiện hợp nhất trên các trẻ em, sau đó tạo một cây mới dựa trên sự hợp nhất đó.Thay thế một số nút trong cùng một cây, bằng cách sử dụng SyntaxNode.ReplaceNode
O là đầu vào ClassDeclerationSyntax
và kết hợp có ba thành viên (A, O, B) thuộc loại 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);
}
Điều này không có tác dụng. Trong lần lặp thứ hai ReplaceNode
trả lại nút hoàn toàn chưa được sửa đổi (oldUpdated == updated
là true
). Có vẻ như sau lần lặp đầu tiên của vòng lặp, tất cả trẻ em đã được xây dựng lại làm đối tượng mới và các đối tượng con gốc được lưu trữ trong kết hợp của tôi không còn có thể tìm thấy trong danh sách trẻ em (updated.ChildNodes().Where(x => x == m.O)
trống).
Cách tốt nhất để làm điều này là gì?
Tôi tin rằng bạn sẽ có thể làm điều này bằng chú thích. – svick