एक स्कैला कंपाइलर प्लगइन में, मैं एक नई कक्षा बनाने की कोशिश कर रहा हूं जो पूर्व-मौजूदा विशेषता को कार्यान्वित करे। अब तक मेरा कोड इस तरह दिखता है:स्कैला कंपाइलर प्लगइन में एक नई कक्षा कैसे जोड़ें?
def trait2Impl(original: ClassDef, newName: String): ClassDef = {
val impl = original.impl
// Seems OK to have same self, but does not make sense to me ...
val self = impl.self
// TODO: implement methods ...
val body = impl.body
// We implement original
val parents = original :: impl.parents
val newImpl = treeCopy.Template(impl, parents, self, body)
val name = newTypeName(newName)
// We are a syntheic class, not a user-defined trait
val mods = (original.mods | SYNTHETIC) &~ TRAIT
val tp = original.tparams
val result = treeCopy.ClassDef(original, mods, name, tp, newImpl)
// Same Package?
val owner = original.symbol.owner
// New symbol. What's a Position good for?
val symbol = new TypeSymbol(owner, NoPosition, name)
result.setSymbol(symbol)
symbol.setFlag(SYNTHETIC)
symbol.setFlag(ABSTRACT)
symbol.resetFlag(INTERFACE)
symbol.resetFlag(TRAIT)
owner.info.decls.enter(symbol)
result
}
लेकिन ऐसा लगता है कि यह पैकेज में जोड़ा नहीं जा रहा है। मुझे संदेह है कि वास्तव में यह पैकेज पीढ़ी के कारण होने वाली विशेषता से पहले "घुमावदार" हो गया है, और/या क्योंकि "ओवरराइड डीफ़ ट्रांसफॉर्म (पेड़: वृक्ष): ट्रीपिंग ट्रांसफॉर्मर की विधि" पेड़ "विधि केवल एक पेड़ लौटा सकती है, के लिए हर पेड़ जो इसे प्राप्त करता है, इसलिए यह वास्तव में एक नया पेड़ नहीं बना सकता है, लेकिन केवल एक को संशोधित कर सकता है।
तो, आप मौजूदा पैकेज में एक नई कक्षा कैसे जोड़ते हैं? शायद यह काम करेगा अगर मैंने पैकेज को बदल दिया, जब "ट्रांसफॉर्म (ट्री)" इसे प्राप्त करता है, लेकिन मुझे लगता है कि मुझे अभी तक पैकेज की सामग्री नहीं पता है, इसलिए मैं इस कक्षा में नई कक्षा उत्पन्न नहीं कर सकता (या मैं कर सकता हूं?) । या शायद यह प्रतीक के "स्थिति" पैरामीटर से संबंधित है?
अब तक मुझे कई उदाहरण मिले हैं जहां पेड़ संशोधित किए गए हैं, लेकिन कंपाइलर प्लगइन में कोई भी पूरी तरह से नई कक्षा नहीं बनाई गई है।
में बदल देती है तो आप समस्या का समाधान हो गया है? मेरे पास एक समान है, इसलिए मैं सोच रहा था ... मुझे लगता है कि दुर्भाग्यवश, आपको ट्रांसफॉर्म विधि में अपने गुण के माता-पिता के लिए मिलान करने की आवश्यकता है। यही है, पैकेजडिफ और टेम्पलेट के लिए देखो, और अपने शरीर में अपने गुणों की सभी घटनाओं को ढूंढें। फिर आप एक रूपांतरित पैकेजडिफ और टेम्पलेट –
वापस कर सकते हैं हां, मुझे स्कैला मेलिंग सूची से सहायता मिली है। लेकिन मैं अभी तक नहीं हूं, क्योंकि मैं केवल उसी पैकेज में कक्षा बना सकता हूं *। जब मैं चीजों को हल करता हूं तो मैं अपने प्रश्न का उत्तर पोस्ट करने का प्रयास करूंगा। –
कृपया अभी अपने प्रश्न का उत्तर दें! क्योंकि मेरे पास वही है [प्रश्न] (https://github.com/iron9light/autoguice) – iron9light