首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala3好用的反射宏: CyclicReference

Scala3好用的反射宏: CyclicReference
EN

Stack Overflow用户
提问于 2021-02-14 17:55:56
回答 1查看 127关注 0票数 2

我正在尝试访问作为宏实现的方法的参数。

代码语言:javascript
复制
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
        '{()}
    }
}

调用点可能类似于:

代码语言:javascript
复制
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() }
}

现在,在defSym.tree上,当宏展开时,我得到了一个CyclicReference错误。我知道defSym.tree是循环的,因为它包含当前正在展开的宏的代码,但是我仍然需要访问方法定义的“树”版本来访问它的名称和参数,而不是方法的主体。我如何才能在不骑自行车的情况下获得这些信息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-19 15:26:04

此问题已在最近发布的Scala 3.0.0-RC1版本中修复。

def foo(a: String, b: Int) = Foo.impl示例中使用defSym.tree现在可以很好地工作,只需将EmptyTree用于宏主体即可。您可以轻松地从方法参数或定义foo的类型层次结构中提取所需的任何信息,这就是我的用例。

代码语言:javascript
复制
DefDef(
    foo,
    List(
        List(
            ValDef(
                a,
                TypeTree[TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Predef),type String)],
                EmptyTree
            ), 
            ValDef(
                b,
                TypeTree[TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int)],
                EmptyTree
            )
        )
    ),
    TypeTree[TypeRef(ThisType(TypeRef(NoPrefix,module class scala)),class Unit)],
    EmptyTree
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66194225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档