使用scala宏获取注释

时间:2015-01-25 22:11:52

标签: scala annotations scala-macros

我正在写一个允许"实现"某些类的成员的一些注释,但它只是使scalac失败并出现断言错误。

以下是它的一个非常简化的版本:一个宏,它给出了给定类型的第一个注释的实例,

import scala.language.experimental.macros
import scala.reflect.macros.whitebox

object FirstAnn {
  def applyImpl[T: c.WeakTypeTag, Ann: c.WeakTypeTag](c: whitebox.Context): c.Tree = {
    import c.universe._

    val tpe = weakTypeOf[T]
    val annTpe = weakTypeOf[Ann]

    val constructor = tpe.decl(termNames.CONSTRUCTOR).asMethod

    val l =
      constructor.paramLists.flatten.flatMap { sym =>
        tpe.member(sym.name).annotations.filter(_.tree.tpe =:= annTpe).map(_.tree)
      }

    l match {
      case h :: _ =>
        h
      case Nil =>
        c.abort(c.enclosingPosition, s"No $annTpe annotation found")
    }
  }

  def apply[T, Ann]: Ann = macro applyImpl[T, Ann]
}

为以下示例调用此宏,

@getter case class TestAnnotation(value: String) extends annotation.StaticAnnotation
case class Test(
  @TestAnnotation("test") member: String
)
来自sbt console

,例如

FirstAnnotation[Test, TestAnnotation]

使scalac失败,出现断言错误,输出完全溢出终端。

所以我的问题是:我可以按照我想要的方式获取注释实例吗?这可能是scalac或scala-macros bug吗?

0 个答案:

没有答案