का उपयोग करके, उसी पेड़ में कई नोड्स को प्रतिस्थापित करना, मैं वर्तमान में रोज़लिन का उपयोग करके सिंटैक्स पेड़ों पर तीन-तरफा विलय पर काम कर रहा हूं। मेरे पास 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 == updated
true
है)।
ऐसा लगता है कि लूप के पहले पुनरावृत्ति के बाद, सभी बच्चों को नई वस्तुओं के रूप में पुनर्निर्मित किया गया है, और मेरे मिलान में संग्रहीत मूल बच्चों-वस्तुओं को अब बच्चों की सूची में नहीं देखा जा सकता है (updated.ChildNodes().Where(x => x == m.O)
खाली है)।
ऐसा करने का एक अच्छा तरीका क्या होगा?
मेरा मानना है कि आप इस व्याख्या का उपयोग करने के लिए सक्षम होना चाहिए। – svick