我有以下宏(它找到启动对象 - 项目被分成几个sbt模块,其中一些可能需要初始化):
object FinderMacro {
def inject[A <: {def self(): A}]: Seq[A] = macro injectImpl[A]
def injectImpl[A : c.WeakTypeTag](c: Context): c.Expr[Seq[A]] = {
import c.universe._
val tpe = c.weakTypeOf[A].typeSymbol
val classess = c.mirror.staticPackage("<empty>").typeSignature.declarations.collect {
case symbol if symbol.typeSignature.baseClasses.contains(tpe) =>
Apply(Select(TypeTree(symbol.typeSignature), newTermName("self")), Nil)
}.toList
c.Expr[Seq[A]](Apply(Select(reify(Seq).tree, newTermName("apply")), classess))
}
}
但它不起作用:
Unexpected tree in genLoad: XXX.type/class scala.reflect.internal.Trees$TypeTree ...
接下来是宏调用者树。 我该怎么做才能摆脱这个错误?
编辑:
我通过将引导对象更改为类并使用构造函数对它们进行实例化来解决此问题:
Apply(Select(New(Ident(symbol)), nme.CONSTRUCTOR), Nil)