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