HIR の型検査
hir_analysis クレートには、「型収集」のソースと
関連する多くの機能が含まれています。
関数本体の検査は hir_typeck クレートで実装されています。
これらのクレートは、型推論 と トレイト解決 に大きく依存しています。
型収集
型「収集」とは、ユーザーが書いた構文上のものを表す HIR 内の型
(hir::Ty)を、コンパイラが使用する内部表現(Ty<'tcx>)へ変換するプロセスです。
where 句や関数シグネチャのその他の部分についても、同様の変換を行います。
違いの感覚をつかむために、次の関数を考えてみましょう。
struct Foo { }
fn foo(x: Foo, y: self::Foo) { ... }
// ^^^ ^^^^^^^^^
これら 2 つのパラメーター x と y は、それぞれ同じ型を持ちます。しかし、それらは
異なる hir::Ty ノードを持ちます。これらのノードは異なる span を持ち、当然ながら
パスのエンコード方法も多少異なります。しかし、いったん Ty<'tcx> ノードへ「収集」されると、
まったく同じ内部型として表現されます。
収集は、コンパイル対象のクレート内にあるさまざまな関数、トレイト、およびその他のアイテムに関する情報を計算するための クエリの束として定義されています。 これらの各クエリは 手続き間 の事柄を扱うことに注意してください。 たとえば、関数定義については、収集によって関数の型とシグネチャが判明しますが、 関数の本体をいかなる形でも訪問することはなく、ローカル変数の型注釈を調べることもありません (それは型検査の仕事です)。
詳細については、collect モジュールを参照してください。
TODO: 型検査について実際に説明する… #1161