5

चलो कहते हैं कि मैं दो SyntaxTree रों एक और बी, करते हैं
जहां बीएक पर परिवर्तन लागू करने के द्वारा उत्पादित किया गया है।रोसलिन SyntaxTree Diff

मैं निम्नलिखित जानकारी प्राप्त करना चाहते हैं:

  • SyntaxNodes & टोकन कि एक से हटा दिया गया है बी
  • SyntaxNodes निर्माण करने के लिए & टोकन कि करने के लिए एक में जोड़ा गया है बी

क्या इसके लिए कोई एपीआई है?
यदि नहीं, तो यह कुशलता से गणना कैसे की जा सकती है?

यह जानकारी Roslyn,
के लिए उपलब्ध होनी चाहिए क्योंकि अपरिवर्तित GreenNode एस पेड़ के बीच साझा की जाती है।

एक समाधान जो मैं सोच सकता हूं SyntaxTree.GetChangedSpans()
का उपयोग करना है और फिर अंतरण टोकन को देखना है।
हालांकि यह हैक की तरह लगता है और मुझे यकीन नहीं है कि यह हमेशा सटीक है या नहीं।
एक छोटा सा पाठ परिवर्तन एक SyntaxTree पर एक बड़ा प्रभाव हो सकता है:

+0

यदि आपके पास वास्तव में दो एएसटी हैं और इन तक पहुंच है, तो यह सरल लगता है। ए के नोड्स की एक सूची बनाएं, और बी नोड्स (ए) के नोड्स -ग्रीन को हटा दिया गया है। नोड्स (बी) -ग्रीन वे हैं जो जोड़े गए हैं। आपको बस इतना करना है कि पेड़ चलना, कुछ सेट बनाएं और सेट घटाएं। मैं Rosyln उपयोगकर्ता नहीं हूँ, लेकिन यह मुश्किल है? –

+0

मुझे लगता है कि तकनीकी कारणों से इसे कुशलता से करना संभव नहीं है। (नोड्स के "अस्थिर" 'GetHashCode()' कार्यान्वयन के कारण 'हैशसेट्स 'का उपयोग नहीं कर सकता है। समानता कार्य करता है: 'सिंटेक्स नोड। IEquivalentTo() '। हालांकि मैं ** बी ** बीसीएस ओ (एन^2) में प्रत्येक नोड में ** प्रत्येक ** में प्रत्येक नोड की तुलना करने से बचना चाहता हूं। – 3dGrabber

+0

तो रोज़लिन निराश है। (मैं एक ऐसी प्रणाली का निर्माण करता हूं जो रोज़िलिन की तरह कुछ करता है, और मेरी सुझाई गई विधि ठीक काम करेगी; असल में हमारे पास एक "स्मार्ट differencer" है जो पेड़ों की एक और अधिक शानदार तुलना द्वारा काम करता है, एक बहुत चालाक तरीके से। जैव)। –

उत्तर

1

हम internally have a differ कि संकलक परत में रहती है (उदाहरण के लिए *+ साथ एक अभिव्यक्ति में जगह अपने आदेश/पूर्वता बदल सकता है) और इस तरह हरे नोड्स का उपयोग करता है , हमने अभी इसे एपीआई के रूप में उजागर नहीं किया है। वास्तव में GetGangedSpans को चलाने के लिए हम इसका उपयोग करते हैं। हम जानबूझकर ने हरे नोड्स का खुलासा नहीं किया क्योंकि यह एक कार्यान्वयन विस्तार है।

कोई विशिष्ट कारण नहीं है कि एपीआई सार्वजनिक नहीं हो सका। मुझे लगता है कि जब यह चारों ओर आया तो हम इस बात से चिंतित थे कि वास्तव में व्यवहार कैसा है, या कम से कम "भलाई" क्या है, आप इस अंतर से अपेक्षा कर सकते हैं। वह, और वास्तव में यह सुनिश्चित करने के लिए हमारे पास एक प्रेरक परिदृश्य नहीं था कि हमारा काम उपयोगी था।

+0

यह पहला प्रश्न है: कोई सार्वजनिक एपीआई नहीं है। कोई भी मौका है कि 'सिंटेक्सडिफर' सार्वजनिक हो सकता है? (पुल अनुरोध?)। या हम 'सिंटेक्स ट्री.गेट चेंजडस्पैन' या 'सिंटेक्स ट्री.गेट चेंज' का उपयोग कर इसके आसपास काम कर सकते हैं? – 3dGrabber

+0

इसके अलावा: मुझे Roslyn API के बारे में प्रश्न कहां से पूछना चाहिए? एसओ, गिटहब, एमएसडीएन? (उदाहरण के लिए "SyntaxTree.GetChangedSpans' और' SyntaxTree.GetChanges' "के बीच क्या अंतर है) – 3dGrabber

+0

आप पूरी तरह से पुल अनुरोध सबमिट कर सकते हैं। मैं सबसे पहले सुझाव देता हूं कि आप गिटहब पर एक बग खोलें ताकि लोगों को पता चले कि कोई समस्या है और कुछ प्रतिनिधित्व है कि आप वास्तव में काम कर रहे हैं। इससे लोगों को किसी भी मुद्दे के साथ झुकाव भी मिल जाएगा जो उन्हें पता है कि आप इसे सार्वजनिक करने से पहले ठीक करना चाहते हैं। हो सकता है कि यह कोड वास्तव में सबकुछ के रूप में छोटी है और इसलिए हमने इसे सार्वजनिक नहीं किया है। एक "ड्राइव द्वारा" पुल अनुरोध सिर्फ लोगों को एक्सेस संशोधक को बदलने के लिए अस्वीकार कर दिया जाएगा क्योंकि हमें एक समर्थित, विचार-विमर्श, अच्छी तरह से गठित एपीआई बनाए रखना है। :-) –