我正在写一个允许"实现"某些类的成员的一些注释,但它只是使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吗?