类型检查

rustc_typeck crate 包含"类型收集"和"类型检查"的源代码,和其它一些相关功能。(它很大程度依赖于type inferencetrait solving。)

类型收集

类型"收集"是将用户写入的语法内容 HIR(hir::Ty) 中的类型转化为编译器使用的内部表示(Ty<'tcx>)的过程 – 对 where 子句和函数签名的其他位也进行类似的转换。

为了尝试并感受到这种差异,请考虑下面的函数:

struct Foo { }
fn foo(x: Foo, y: self::Foo) { ... }
//        ^^^     ^^^^^^^^^

这两个参数 xy 有相同的类型: 但他们是不懂的 hir::Ty 节点。这些节点有不同的 span,当然它们的编码路径也有所不同。但它们一旦"被收集"到 Ty<'tcx> 节点,它们会使用完全相同的内部类型。

集合被定义为计算关于正在编译的 crate 中的各种函数、特性和其他项的信息的一组查询。请注意,每个查询都与过程间事物有关——例如,对于函数定义,集合将计算出函数的类型和签名,但它不会以任何方式访问函数体,也不会检查局部变量的类型注释(这是类型检查的工作)。

更多有关详细信息,请参阅 collect 模块。

TODO: 实际上谈到类型检查...