1 use rustc_middle
::traits
::ObligationCause
;
2 use rustc_middle
::ty
::{self, ToPredicate, Ty}
;
4 use crate::traits
::{Obligation, PredicateObligation}
;
6 use super::type_variable
::{TypeVariableOrigin, TypeVariableOriginKind}
;
9 impl<'a
, 'tcx
> InferCtxt
<'a
, 'tcx
> {
10 /// Instead of normalizing an associated type projection,
11 /// this function generates an inference variable and registers
12 /// an obligation that this inference variable must be the result
13 /// of the given projection. This allows us to proceed with projections
14 /// while they cannot be resolved yet due to missing information or
15 /// simply due to the lack of access to the trait resolution machinery.
16 pub fn infer_projection(
18 param_env
: ty
::ParamEnv
<'tcx
>,
19 projection_ty
: ty
::ProjectionTy
<'tcx
>,
20 cause
: ObligationCause
<'tcx
>,
21 recursion_depth
: usize,
22 obligations
: &mut Vec
<PredicateObligation
<'tcx
>>,
24 let def_id
= projection_ty
.item_def_id
;
25 let ty_var
= self.next_ty_var(TypeVariableOrigin
{
26 kind
: TypeVariableOriginKind
::NormalizeProjectionType
,
27 span
: self.tcx
.def_span(def_id
),
30 ty
::Binder
::dummy(ty
::ProjectionPredicate { projection_ty, term: ty_var.into() }
);
31 let obligation
= Obligation
::with_depth(
35 projection
.to_predicate(self.tcx
),
37 obligations
.push(obligation
);