2012-08-25 18 views
10

स्केल 2.10 एएसटी में किसी तत्व की खोज करने का सबसे अच्छा तरीका क्या है?स्कैला 2.10 एएसटी

पेड़ power.trees(code) या mirror.mkToolBox().parseExpr(code) संपादित का एक परिणाम हो सकता है। 2.10.0-आरसी 1 parseExpr का नाम बदलकर parse कर दिया गया है।

मेरे द्वारा उपयोग किए जाने वाले ठोस उपयोग-मामले विधि विधि, द्वारा किसी दिए गए वर्ग/ऑब्जेक्ट कोड से विधि का कोड निकाल रहा है, लेकिन मुझे लगता है कि प्रश्न अधिक सामान्य तरीके से तैयार किए जाने पर दूसरों के लिए अधिक प्रासंगिक होगा ।

उत्तर

5

हो सकता है कि आप एक बार देख https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606 में, विशेष रूप से कक्षाओं traverser, ट्रांसफार्मर और खिलाड़ी को बदलने के तरीके (Tree.substituteSymbols, Tree.substituteTypes या Tree.substituteThis) पर होना चाहिए। यदि आप एक पेड़ से एक विधि निकालना चाहते हैं, तो आप Traverser का उपयोग कर सकते हैं और traverse विधि को ओवरराइड कर सकते हैं। ट्रैवर्स विधि में, आप जांचते हैं कि नोड आपके इच्छित विधि से मेल खाता है या नहीं। यदि हां, तो आप कर चुके हैं। यदि नहीं, तो आप super.traverse पर कॉल करें।

+1

लिंक किए गए कोड ट्रंक की तुलना में काफी अप्रचलित है। यहां सही लिंक दिए गए हैं: 1) पेड़ एएसटी कक्षाएं: https://github.com/scala/scala/blob/2.10.x/src/library/scala/reflect/base/Trees.scala, 2) ट्रांसफार्मर और ट्रैवर्स: https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606 –

+0

ओह, धन्यवाद ... –

+1

यहां एक ट्रांसफॉर्मर का उदाहरण दिया गया है: https://github.com/scala/scala/blob/46d57d47e81c8794a9a3594e080576788cc92324/src/compiler/scala/reflect/reify/phases/Reshape.scala (कोड निश्चित रूप से एक सफाई का उपयोग करेगा, लेकिन यह अनदेखा करने के लिए एक उदाहरण का बहुत अच्छा है)। 'Super.transform' और 'copyAttrs' भागों पर ध्यान दें। –

संबंधित मुद्दे