タイプマクロ(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
とshowRaw
も、STATIC
の兆候を示していません。
どうすればこの問題を解決できますか?
こんにちはSimon!申し訳ありません。あなたができるだけ早く報告したこの問題や他の問題に挑戦します。 –