Module rustc_trait_selection::traits::project
source · Expand description
Code for projecting associated types out of trait references.
Structs
- The inverse of
BoundVarReplacer
: replaces placeholders with the bound vars from which they came. - Progress 🔒
Enums
- States returned from
poly_project_and_unify_type
. Takes the place of the old return type, which was: - When attempting to resolve
<T as TraitRef>::Name
… - Depending on the stage of compilation, we want projection to be more or less conservative.
Traits
Functions
- In the case of a trait object like
<dyn Iterator<Item = ()> as Iterator>::Item
we can use the existential predicate in the trait object. - The first thing we have to do is scan through the parameter environment to see whether there are any projection predicates there that can answer this question.
- In the case of a nested projection like
<<A as Foo>::FooT as Bar>::BarT
, we may find that the definition ofFoo
has some clues: - Confirm and normalize the given inherent projection.
- The guts of
normalize
: normalize a specific projection like<T as Trait>::Item
. The result is always a type (and possibly additional obligations). If ambiguity arises, which implies that there are unresolved type variables in the projection, we will substitute a fresh type variable$X
and generate a new obligation<T as Trait>::Item == $X
for later. - If we are projecting
<T as Trait>::Item
, butT: Trait
does not hold. In various error cases, we cannot generate a valid normalized projection. Therefore, we create an inference variable return an associated obligation that, when fulfilled, will lead to an error. - As
normalize
, but with a custom depth. - The guts of
normalize
: normalize a specific projection like<T as Trait>::Item
. The result is always a type (and possibly additional obligations). ReturnsNone
in the case of ambiguity, which indicates that there are unbound type variables. - Evaluates constraints of the form:
- project 🔒Computes the result of a projection type (if we can).
- Evaluates constraints of the form:
- Executes
f
onvalue
after replacing all escaping bound variables with placeholders and then replaces these placeholders with the original bound variables in the result.