【问题标题】:How to Typecheck a DefDef如何键入检查 Def Def
【发布时间】:2014-03-12 20:52:14
【问题描述】:

在注解宏中,我正在枚举一个类的成员,并且想要找到我找到的方法的类型。

所以我很高兴地遍历类的body,并收集所有DefDef 成员。

...我无法进行类型检查。

对于每个DefDef,我尝试将其包装在Expr 中并使用actualType。我试过复制这个东西并将它移植到一个临时类中(通过准引号)。我已经尝试了我能想到的所有其他方法:)

我能得到的最好的是NoTypeAny,这取决于所使用的技术。我得到的最糟糕的事情是向我抛出异常。

这些是def foo(i: String) = i 形式的简单方法,因此需要推断返回类型,但不需要外部信息。这里没有抽象类型、类型参数或类的其他成员。我想稍后处理更高级的案例,但希望先让这些琐碎的例子工作。

在插件中,这很简单。我只需对已抑制错误的整个单元进行类型检查,并通过符号获得我想要的内容,然后重置树属性以进行后续处理。作为一个宏......我很难过。

我错过了什么?

【问题讨论】:

    标签: scala macros scala-macros scala-macro-paradise


    【解决方案1】:

    在宏中也是一样的。您调用c.typeCheck 而不是插件中的typed,但必须小心不要陷入应该在2.10.5 和2.11.0 中修复的陷阱(https://github.com/scalamacros/paradise/issues/1)。从c.typeCheck 成功返回后,您可以访问该符号并执行所有常规操作。

    【讨论】:

    • 我已经在 2.11.0-M8 上,所以我得看看 RC1 是否有帮助。那当然可以尝试Block 包装器:) 我也很震惊,我可能在检查整个封闭上下文时有一些运气。
    • 这是骗人的 :) 我升级到 RC1 并消除了我在不静默检查时偶尔遇到的错误,但 c.typecheck 返回的 Tree 是 still NoType .获得.symbol.info 确实成功了,我可以清楚地看到预期的类型。
    • 这里是后续问题的链接:stackoverflow.com/questions/22451181/…
    猜你喜欢
    • 2023-02-10
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多