我正试图在Scala中编写一个宏,它读取带有特定注释的变量来操作它们,但变量符号的annotations属性似乎总是返回一个空列表。
注释签名:
class Inject extends StaticAnnotation
注释用法:
object App {
@Inject
var service: HttpService = _
}
宏定义(黑盒):
def inject[T <: Config](c: Context)(target: c.Expr[T])(implicit tag: c.WeakTypeTag[T]): c.Expr[ModuleProxy] = {
import c.universe._
val fields = tag.tpe.members collect { case s: TermSymbol => s}
// Always empty.
fields foreach { s => println(s"$s : ${s.annotations}") }
}
有什么我应该调查的吗?任何形式的建议都将不胜感激。
谢谢!
如果不使用scala.annotation.meta
注释之一对注释进行注释,则该注释将位于vals/vars的底层字段上。要获得这些,请执行val fields = tag.tpe.decls.collect{ case s: TermSymbol if !s.isMethod => s }
,然后应该可以了。