2013-01-22 51 views
6

मैं एक प्रकार के मैक्रो (नाम Static) के साथ एक वर्ग (नाम Foo) नामक एक स्थिर फ़ील्ड (bar नामित) जोड़ना चाहता हूं। ,एक स्थिर सदस्य कैसे उत्पन्न करें और इसे किसी प्रकार के मैक्रो के भीतर किसी वर्ग में जोड़ें?

मैक्रो

import language.experimental.macros 
import scala.reflect.macros.Context 

package object statics { 

    type Static = macro Statics.addStaticField 

    object Statics { 

    def addStaticField(c: Context): c.Tree = { 
     import c.universe._ 

     val STATIC = 1 << 23 
     type CompilerSymbol = scala.tools.nsc.Global#Symbol 
     def setFlag(symbol: Symbol, flag: Long) { 
     val compilerSymbol = symbol.asInstanceOf[CompilerSymbol] 
     println("Setting flag ...") 
     compilerSymbol.setFlag(flag) 
     } 
     def printFlags(symbol: Symbol) { 
     println("Flags: " + symbol.asInstanceOf[CompilerSymbol].flagString) 
     } 

     val staticField: ValDef = 
     ValDef(
      mods = Modifiers(), 
      name = TermName("bar"), 
      tpt = TypeTree(), 
      rhs = Literal(Constant(42)) 
     ) 
     printFlags(staticField.symbol) 
     setFlag(staticField.symbol, STATIC) 
     printFlags(staticField.symbol) 

     val Template(parents, _, existingCode) = c.enclosingTemplate 

     Template(Nil, emptyValDef, staticField :: existingCode) 
    } 
    } 
} 

संकलन के दौरान, setFlag करने के लिए कॉल असर पड़ रहा है क्योंकि झंडा स्ट्रिंग परिवर्तन:

यह कैसे मैं वर्तमान में यह करने के लिए कोशिश कर रहा हूँ है

Flags: 
Setting flag ... 
Flags: <static> 

लेकिन ऐसा लगता है कि इसका उपयोग साइट पर बिल्कुल वास्तविक प्रभाव नहीं है:

package statics 

class Foo extends Static 

object Main extends App { 
    Foo.bar  // Fails to compile 
    (new Foo).bar // Compiles 
} 

show और showRawSTATIC का कोई भी संकेत भी नहीं दिखाते।

मैं इस मुद्दे को कैसे हल कर सकता हूं?

+0

हाय साइमन! क्षमा करें मैं वास्तव में इन दिनों swamped किया गया है। इस और आपके द्वारा रिपोर्ट की जाने वाली अन्य समस्याओं को प्राप्त करने का प्रयास करेंगे। –

उत्तर

1

जहां तक ​​मुझे पता है, आपको एक स्थिर क्षेत्र रखने के लिए एक साथी वस्तु उत्पन्न करने की आवश्यकता होगी, और फिलहाल यह प्रकार मैक्रोज़ के साथ संभव नहीं है।

+0

मैं कहूंगा कि यह उत्तर सही है। जो मुझे पता है, स्टेटिक केवल वस्तुओं के सदस्यों पर रखा जाना चाहिए: http://groups.google.com/group/scala-internals/browse_thread/thread/d385bcd60b08faf6 –

+1

जहां तक ​​मुझे पता है, 'स्केलैक' जोड़ रहा है साथी वस्तुओं की कक्षाओं के लिए स्थिर फॉरवर्डर्स, इसलिए कार्यक्षमता कहीं मौजूद है। मुझे आशा है कि संकलक को कस्टम तत्वों के लिए ऐसा करने का एक तरीका है। – soc