ロギングを扱うマクロ注釈があり、SLF4J と Log4j2 の両方のロギングを処理したいと考えています。残念ながら、これにはlogger
フィールドのタイプを見つける必要があります。注釈が他の質問のクラスにある場合、これを行う方法を知っています。しかし、アノテーションがメソッドにある場合はわかりません。これは私が試したことです:
val loggerType = {
val classImpl = (if (annottees.head.isInstanceOf[DefDefApi])
c.enclosingClass
else
c).asInstanceOf[ImplDef].impl
classImpl.body.collectFirst {
case vd: ValDef if vd.name == TermName("logger") =>
c.typecheck(vd.duplicate).symbol.info
}.getOrElse {
// TODO look at parents
c.abort(c.enclosingPosition, "Logger type not found")
}
}
これはコンパイルされますenclosingClass
が (推奨されません)、この注釈を使用してクラスをコンパイルすると、illegal cyclic reference
. 囲んでいるクラス全体の型チェックも機能しません。
それを行う方法はありますか?