1 use crate::infer::InferCtxt;
2 use crate::traits::Obligation;
3 use rustc_hir::def_id::DefId;
4 use rustc_middle::ty::{self, ToPredicate, Ty};
6 use super::FulfillmentError;
7 use super::{ObligationCause, PredicateObligation};
9 pub trait TraitEngine<'tcx>: 'tcx {
10 /// Requires that `ty` must implement the trait with `def_id` in
11 /// the given environment. This trait must not have any type
12 /// parameters (except for `Self`).
15 infcx: &InferCtxt<'tcx>,
16 param_env: ty::ParamEnv<'tcx>,
19 cause: ObligationCause<'tcx>,
21 let trait_ref = infcx.tcx.mk_trait_ref(def_id, [ty]);
22 self.register_predicate_obligation(
28 predicate: ty::Binder::dummy(trait_ref).without_const().to_predicate(infcx.tcx),
33 fn register_predicate_obligation(
35 infcx: &InferCtxt<'tcx>,
36 obligation: PredicateObligation<'tcx>,
39 fn select_all_or_error(&mut self, infcx: &InferCtxt<'tcx>) -> Vec<FulfillmentError<'tcx>>;
41 fn select_where_possible(&mut self, infcx: &InferCtxt<'tcx>) -> Vec<FulfillmentError<'tcx>>;
43 fn pending_obligations(&self) -> Vec<PredicateObligation<'tcx>>;
46 pub trait TraitEngineExt<'tcx> {
47 fn register_predicate_obligations(
49 infcx: &InferCtxt<'tcx>,
50 obligations: impl IntoIterator<Item = PredicateObligation<'tcx>>,
54 impl<'tcx, T: ?Sized + TraitEngine<'tcx>> TraitEngineExt<'tcx> for T {
55 fn register_predicate_obligations(
57 infcx: &InferCtxt<'tcx>,
58 obligations: impl IntoIterator<Item = PredicateObligation<'tcx>>,
60 for obligation in obligations {
61 self.register_predicate_obligation(infcx, obligation);