2013-04-24 27 views
6

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 == updatedtrue). 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ì?

+0

Tôi tin rằng bạn sẽ có thể làm điều này bằng chú thích. – svick

Trả lời

6

cách tiếp cận hiện tại của tôi:

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

Đây là phương pháp phù hợp. –

Các vấn đề liên quan