2

我有以下宏(它找到启动对象 - 项目分为几个 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)
4

0 回答 0