2013-01-22 11 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 
} 

showshowRawも、STATICの兆候を示していません。

どうすればこの問題を解決できますか?

+0

こんにちはSimon!申し訳ありません。あなたができるだけ早く報告したこの問題や他の問題に挑戦します。 –

答えて

1

私が知る限り、コンパニオンオブジェクトを生成して静的フィールドを作成する必要があります。タイプマクロでは不可能です。

+0

私はこの答えが正しいと思います。私が知っていることから、STATICはオブジェクトのメンバーに置かれることになっているだけです:http://groups.google.com/group/scala-internals/browse_thread/thread/d385bcd60b08faf6 –

+1

私が知る限り、「scalac」は追加しています静的なフォワーダをコンパニオンオブジェクトのクラスに追加するため、機能はどこかに存在します。私はカスタム要素のためにこれを行うようにコンパイラに指示する方法があることを願っています。 – soc