使用scala宏返回注释
我正在编写一个宏,它允许具体化某些类的成员的一些注释,但它只会使scalac因断言错误而失败 这是它的一个非常简化的版本:一个宏,给出给定类型的第一个注释的实例使用scala宏返回注释,scala,annotations,scala-macros,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.Conte
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控制台,如
使scalac失败并出现断言错误,输出完全溢出我的终端
所以我的问题是:我能以我尝试的方式获得注释实例吗?这可能是scalac或scala宏错误吗?这里的完整示例:您是否尝试在其他文件中定义宏?为什么?我已经在另一个地方调用它,即sbt控制台。仅供参考,在我最初的案例中,宏定义和方法定义已经在不同的文件中,没有更多的成功。
FirstAnnotation[Test, TestAnnotation]