2019-02-04 13:01:14 -06:00
|
|
|
use rustc::hir;
|
2018-09-24 14:27:47 -05:00
|
|
|
use rustc::infer::canonical::{Canonical, QueryResponse};
|
2018-06-27 05:47:55 -05:00
|
|
|
use rustc::traits::query::{normalize::NormalizationResult, CanonicalProjectionGoal, NoSolution};
|
2018-06-27 15:04:32 -05:00
|
|
|
use rustc::traits::{self, ObligationCause, SelectionContext, TraitEngineExt};
|
2018-06-27 08:42:00 -05:00
|
|
|
use rustc::ty::query::Providers;
|
2018-02-25 09:58:54 -06:00
|
|
|
use rustc::ty::{ParamEnvAnd, TyCtxt};
|
2018-03-14 14:11:23 -05:00
|
|
|
use rustc_data_structures::sync::Lrc;
|
2018-06-27 05:47:55 -05:00
|
|
|
use std::sync::atomic::Ordering;
|
2018-02-25 09:58:54 -06:00
|
|
|
use syntax_pos::DUMMY_SP;
|
|
|
|
|
2019-02-06 19:17:48 -06:00
|
|
|
crate fn provide(p: &mut Providers<'_>) {
|
2018-06-27 08:42:00 -05:00
|
|
|
*p = Providers {
|
|
|
|
normalize_projection_ty,
|
|
|
|
..*p
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
fn normalize_projection_ty<'tcx>(
|
2018-02-25 09:58:54 -06:00
|
|
|
tcx: TyCtxt<'_, 'tcx, 'tcx>,
|
|
|
|
goal: CanonicalProjectionGoal<'tcx>,
|
2018-09-24 14:27:47 -05:00
|
|
|
) -> Result<Lrc<Canonical<'tcx, QueryResponse<'tcx, NormalizationResult<'tcx>>>>, NoSolution> {
|
2018-02-25 09:58:54 -06:00
|
|
|
debug!("normalize_provider(goal={:#?})", goal);
|
|
|
|
|
2018-06-27 05:47:55 -05:00
|
|
|
tcx.sess
|
|
|
|
.perf_stats
|
|
|
|
.normalize_projection_ty
|
|
|
|
.fetch_add(1, Ordering::Relaxed);
|
|
|
|
tcx.infer_ctxt().enter_canonical_trait_query(
|
|
|
|
&goal,
|
|
|
|
|infcx,
|
2018-06-27 15:04:32 -05:00
|
|
|
fulfill_cx,
|
2018-06-27 05:47:55 -05:00
|
|
|
ParamEnvAnd {
|
|
|
|
param_env,
|
|
|
|
value: goal,
|
|
|
|
}| {
|
|
|
|
let selcx = &mut SelectionContext::new(infcx);
|
2019-02-04 13:01:14 -06:00
|
|
|
let cause = ObligationCause::misc(DUMMY_SP, hir::DUMMY_HIR_ID);
|
2018-06-27 05:47:55 -05:00
|
|
|
let mut obligations = vec![];
|
|
|
|
let answer = traits::normalize_projection_type(
|
|
|
|
selcx,
|
2018-02-25 09:58:54 -06:00
|
|
|
param_env,
|
2018-06-27 05:47:55 -05:00
|
|
|
goal,
|
|
|
|
cause,
|
|
|
|
0,
|
|
|
|
&mut obligations,
|
|
|
|
);
|
2018-06-27 15:04:32 -05:00
|
|
|
fulfill_cx.register_predicate_obligations(infcx, obligations);
|
|
|
|
Ok(NormalizationResult {
|
|
|
|
normalized_ty: answer,
|
2018-06-27 05:47:55 -05:00
|
|
|
})
|
|
|
|
},
|
|
|
|
)
|
2018-02-25 09:58:54 -06:00
|
|
|
}
|