私は次のマクロを持っています(スタートアップオブジェクトを見つけます - プロジェクトはいくつかの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)