Scala 如何打字检查DEF

Scala 如何打字检查DEF,scala,macros,scala-macros,scala-macro-paradise,Scala,Macros,Scala Macros,Scala Macro Paradise,在注释宏中,我枚举一个类的成员,并希望得到我找到的方法的类型 因此,我愉快地迭代类的主体,并收集所有DefDef成员 。。。我不能打字检查 对于每个DefDef,我都尝试将其包装在Expr中,并使用actualType。我已经尝试过复制这个东西并将其移植到一个特别的类中(通过quasikotes)。我已经尝试了我能想到的一切:) 根据所使用的技术,我能得到的最好结果是NoType或Any。我得到的最糟糕的结果就是向我抛出异常 这些方法很简单,形式为def foo(i:String)=i,因此需要

在注释宏中,我枚举一个类的成员,并希望得到我找到的方法的类型

因此,我愉快地迭代类的
主体
,并收集所有
DefDef
成员

。。。我不能打字检查

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

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

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

在插件中,这很简单。我只需要在错误被抑制的情况下对整个单元进行打字检查,通过符号得到我想要的,然后重置树属性以进行后续处理。作为一个宏。。。我被难住了


我遗漏了什么?

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

我已经在使用2.11.0-M8,因此我必须看看RC1是否有帮助。那就试试
包装器吧当然:)这也让我吃惊,我可能会在检查整个封闭上下文时有点运气。这是骗人的:)我升级到了RC1,并且消除了我在不静默检查时偶尔出现的错误,但是从c.typecheck返回的树仍然是
NoType
。获取
.symbol.info
成功,但我可以清楚地看到预期的类型。下面是后续问题的链接: