有没有办法通过反射从宏实现中访问宏注释的构造函数声明?例如,当我定义这个宏注释时:
class Component(x: String, y: Int = 0) extends StaticAnnotation {
def macroTransform(annottees: Any*): Any = macro ComponentMacro.impl
}
是否可以在宏实现中反映Component
?当我使用类似的东西时:
class ComponentMacro(val c: whitebox.Context) {
import c.universe._
def impl(annottees: c.Expr[Any]*) = {
/* ... */
val t = typeOf[Component] // throws exception
}
}
编译器在宏扩展期间抛出错误。
答案 0 :(得分:0)
您可以使用c.prefix.tree
,如下例所示:
class ComponentMacro(val c: scala.reflect.macros.whitebox.Context) {
import c.universe._
def impl(annottees: c.Expr[Any]*): c.Expr[Any] = {
val annottation = c.prefix.tree
annottation match {
case q""" new $className(..$params) """ => println(s"className=$className, x=$params")
}
c.Expr(q""" case class Test() """)
}
}
对于这个带注释的类:
@Component("FooBar", 5)
case class Test()
将输出:
Warning:scalac: className=Component, x=List("FooBar", 5)