चलो कहते हैं कि मैं दो SyntaxTree
रों एक और बी, करते हैं
जहां बीएक पर परिवर्तन लागू करने के द्वारा उत्पादित किया गया है।रोसलिन SyntaxTree Diff
मैं निम्नलिखित जानकारी प्राप्त करना चाहते हैं:
- SyntaxNodes & टोकन कि एक से हटा दिया गया है बी
- SyntaxNodes निर्माण करने के लिए & टोकन कि करने के लिए एक में जोड़ा गया है बी
क्या इसके लिए कोई एपीआई है?
यदि नहीं, तो यह कुशलता से गणना कैसे की जा सकती है?
यह जानकारी Roslyn,
के लिए उपलब्ध होनी चाहिए क्योंकि अपरिवर्तित GreenNode
एस पेड़ के बीच साझा की जाती है।
एक समाधान जो मैं सोच सकता हूं SyntaxTree.GetChangedSpans()
का उपयोग करना है और फिर अंतरण टोकन को देखना है।
हालांकि यह हैक की तरह लगता है और मुझे यकीन नहीं है कि यह हमेशा सटीक है या नहीं।
एक छोटा सा पाठ परिवर्तन एक SyntaxTree
पर एक बड़ा प्रभाव हो सकता है:
यदि आपके पास वास्तव में दो एएसटी हैं और इन तक पहुंच है, तो यह सरल लगता है। ए के नोड्स की एक सूची बनाएं, और बी नोड्स (ए) के नोड्स -ग्रीन को हटा दिया गया है। नोड्स (बी) -ग्रीन वे हैं जो जोड़े गए हैं। आपको बस इतना करना है कि पेड़ चलना, कुछ सेट बनाएं और सेट घटाएं। मैं Rosyln उपयोगकर्ता नहीं हूँ, लेकिन यह मुश्किल है? –
मुझे लगता है कि तकनीकी कारणों से इसे कुशलता से करना संभव नहीं है। (नोड्स के "अस्थिर" 'GetHashCode()' कार्यान्वयन के कारण 'हैशसेट्स 'का उपयोग नहीं कर सकता है। समानता कार्य करता है: 'सिंटेक्स नोड। IEquivalentTo() '। हालांकि मैं ** बी ** बीसीएस ओ (एन^2) में प्रत्येक नोड में ** प्रत्येक ** में प्रत्येक नोड की तुलना करने से बचना चाहता हूं। – 3dGrabber
तो रोज़लिन निराश है। (मैं एक ऐसी प्रणाली का निर्माण करता हूं जो रोज़िलिन की तरह कुछ करता है, और मेरी सुझाई गई विधि ठीक काम करेगी; असल में हमारे पास एक "स्मार्ट differencer" है जो पेड़ों की एक और अधिक शानदार तुलना द्वारा काम करता है, एक बहुत चालाक तरीके से। जैव)। –