Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

HIR の型検査

hir_analysis クレートには、「型収集」のソースと 関連する多くの機能が含まれています。 関数本体の検査は hir_typeck クレートで実装されています。 これらのクレートは、型推論トレイト解決 に大きく依存しています。

型収集

型「収集」とは、ユーザーが書いた構文上のものを表す HIR 内の型 (hir::Ty)を、コンパイラが使用する内部表現Ty<'tcx>)へ変換するプロセスです。 where 句や関数シグネチャのその他の部分についても、同様の変換を行います。

違いの感覚をつかむために、次の関数を考えてみましょう。

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

これら 2 つのパラメーター xy は、それぞれ同じ型を持ちます。しかし、それらは 異なる hir::Ty ノードを持ちます。これらのノードは異なる span を持ち、当然ながら パスのエンコード方法も多少異なります。しかし、いったん Ty<'tcx> ノードへ「収集」されると、 まったく同じ内部型として表現されます。

収集は、コンパイル対象のクレート内にあるさまざまな関数、トレイト、およびその他のアイテムに関する情報を計算するための クエリの束として定義されています。 これらの各クエリは 手続き間 の事柄を扱うことに注意してください。 たとえば、関数定義については、収集によって関数の型とシグネチャが判明しますが、 関数の本体をいかなる形でも訪問することはなく、ローカル変数の型注釈を調べることもありません (それは型検査の仕事です)。

詳細については、collect モジュールを参照してください。

TODO: 型検査について実際に説明する… #1161