2

マクロとして実装されているメソッドのパラメーターにアクセスしようとしています。

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いますが、メソッドの本体なしで、その名前とパラメーターにアクセスするには、メソッド定義の「ツリー」バージョンにアクセスする必要があります。サイクリングせずにその情報を取得するにはどうすればよいですか?

4

1 に答える 1