如何挑战DefDef

时间:2014-03-12 20:52:15

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

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

所以我很乐意迭代课程的body,并收集所有DefDef成员。

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

对于每个DefDef,我尝试将其包装在Expr并使用actualType。我已经尝试复制这个东西并将其移植到一个特殊的类中(通过quasiquotes)。我已经尝试了其他我能想到的一切:)

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

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

在插件中,这很简单。我只是通过符号检查整个单元并通过符号得到我想要的东西,然后重置树属性以便后续处理。作为一个宏......我很难过。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

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