无法从Scala宏读取变量注释

时间:2014-10-19 03:06:36

标签: scala reflection macros annotations

我正在尝试在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}") }
}

我应该研究一下吗?任何建议都会非常感激。

谢谢!

1 个答案:

答案 0 :(得分:2)

如果您没有使用scala.annotation.meta注释之一注释注释,则注释将落在vals / vars的基础字段上。要掌握这些,请val fields = tag.tpe.decls.collect{ case s: TermSymbol if !s.isMethod => s },然后它应该没问题。