4

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

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

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

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

根据所使用的技术,我能得到的最好的结果是NoType或。Any我得到的最糟糕的是向我抛出异常。

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

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

我错过了什么?

4

1 回答 1

2

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

于 2014-03-13T17:31:16.547 回答