blob: 5fd10663694c52fa4878f569f35950e739c07a15 [file] [view]
# HIR Type checking
The [`hir_analysis`] crate contains the source for "type collection" as well
as a bunch of related functionality.
Checking the bodies of functions is implemented in the [`hir_typeck`] crate.
These crates draw heavily on [type inference] and [trait solving].
[`hir_analysis`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir_analysis/index.html
[`hir_typeck`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir_typeck/index.html
[type inference]: ./../type-inference.md
[trait solving]: ./../traits/resolution.md
## Type collection
Type "collection" is the process of converting the types found in the HIR
(`hir::Ty`), which represent the syntactic things that the user wrote, into the
**internal representation** used by the compiler (`Ty<'tcx>`).
Note that we also do similar conversions for where-clauses and other bits of the function signature.
To try and get a sense of the difference, consider this function:
```rust,ignore
struct Foo { }
fn foo(x: Foo, y: self::Foo) { ... }
// ^^^ ^^^^^^^^^
```
Those two parameters `x` and `y` each have the same type,
but they will have distinct `hir::Ty` nodes.
Those nodes will have different spans, and of course they encode the path somewhat differently.
But once they are "collected" into
`Ty<'tcx>` nodes, they will be represented by the exact same internal type.
Collection is defined as a bundle of [queries] for computing information about
the various functions, traits, and other items in the crate being compiled.
Note that each of these queries is concerned with *interprocedural* things
for example, for a function definition, collection will figure out the type and
signature of the function, but it will not visit the *body* of the function in
any way, nor examine type annotations on local variables (that's the job of type *checking*).
For more details, see the [`collect`][collect] module.
[queries]: ../query.md
[collect]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir_analysis/collect/index.html
**TODO**: actually talk about type checking... [#1161](https://github.com/rust-lang/rustc-dev-guide/issues/1161)