マクロとして実装されているメソッドのパラメーターにアクセスしようとしています。
object Macros {
def impl()(using Quotes): Expr[Unit] = {
import quotes.reflect._
val params: List[List[ValDef]] = {
def nearestEnclosingMethodParams(owner: Symbol): List[List[ValDef]] =
owner match {
case defSym if defSym.isDefDef =>
defSym.tree.asInstanceOf[DefDef].paramss
case _ =>
nearestEnclosingMethod(owner.owner)
}
nearestEnclosingMethodParams(Symbol.spliceOwner)
}
println(params) // I would do something useful with params names and types here
'{()}
}
}
呼び出しサイトは次のようになります。
object Test {
def foo(a: String, b: Int) = Foo.impl
@main def run(): Unit = {
val x = foo("blah", 24)
()
}
}
object Foo {
inline def impl = ${ Macros.impl() }
}
今のCyclicReference
ところ、マクロを展開するとエラーが発生しますdefSym.tree
。現在展開中のマクロのコードが含まれているため、循環的であることは理解してdefSym.tree
いますが、メソッドの本体なしで、その名前とパラメーターにアクセスするには、メソッド定義の「ツリー」バージョンにアクセスする必要があります。サイクリングせずにその情報を取得するにはどうすればよいですか?