2013-04-24 3 views
6

का उपयोग करके, उसी पेड़ में कई नोड्स को प्रतिस्थापित करना, मैं वर्तमान में रोज़लिन का उपयोग करके सिंटैक्स पेड़ों पर तीन-तरफा विलय पर काम कर रहा हूं। मेरे पास ClassDeclerationSyntax नोड पर सभी बच्चों के बीच एक मिलान है, और बच्चों पर विलय करना चाहते हैं, और उसके बाद उस विलय के आधार पर एक नया पेड़ बनाना चाहते हैं।SyntaxNode.ReplaceNode

ओ इनपुट ClassDeclerationSyntax है, और मिलान 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 == updatedtrue है)।

ऐसा लगता है कि लूप के पहले पुनरावृत्ति के बाद, सभी बच्चों को नई वस्तुओं के रूप में पुनर्निर्मित किया गया है, और मेरे मिलान में संग्रहीत मूल बच्चों-वस्तुओं को अब बच्चों की सूची में नहीं देखा जा सकता है (updated.ChildNodes().Where(x => x == m.O) खाली है)।

ऐसा करने का एक अच्छा तरीका क्या होगा?

+0

मेरा मानना ​​है कि आप इस व्याख्या का उपयोग करने के लिए सक्षम होना चाहिए। – svick

उत्तर

6

मेरे वर्तमान दृष्टिकोण:

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

यह सही दृष्टिकोण है। –