我想向具有类型宏(名为bar
)的类(名为Foo
)添加静态字段(在此示例中为Static
)。
这是我目前正在尝试执行的操作:
宏
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
的任何迹象。我该如何解决这个问题?
最佳答案
据我所知,您将需要生成一个伴随对象以具有静态字段,而这是类型宏目前无法实现的。
关于scala - 如何生成静态成员并将其添加到类型宏内的类中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14463463/