在注释宏中,我列举了一个类的成员,并且想要找到我找到的方法的类型.
所以我很乐意迭代这个类的主体,并收集所有的DefDef成员.
…我无法进行类型检查.
对于每个DefDef,我尝试将它包装在Expr中并使用actualType.我已经尝试复制这个东西并将其移植到一个特殊的类中(通过quasiquotes).我已经尝试了一切我能想到的:)
我能得到的最好的是NoType或Any,具体取决于所使用的技术.我得到的最糟糕的事情就是向我抛出异常.
这些是def foo(i:String)= i形式的简单方法,因此需要推断返回类型,但不需要外部信息.此处涉及的类没有抽象类型,类型参数或其他成员.我想稍后处理更高级的案例,但是希望让这些琐碎的例子先行.
在插件中,这很简单.我只是通过符号检查整个单元并通过符号得到我想要的东西,然后重置树属性以便后续处理.作为一个宏……我很难过.
我错过了什么?
最佳答案 在一个宏中,它是一样的.您可以调用c.typeCheck而不是插入插件,但必须注意不要陷入应该在2.10.5和2.11.0中修复的陷阱(
https://github.com/scalamacros/paradise/issues/1).从c.typeCheck成功返回后,您可以访问该符号并执行所有常用操作.