rustc_next_trait_solver/
delegate.rs1use std::ops::Deref;
2
3use rustc_type_ir::solve::{Certainty, Goal, NoSolution};
4use rustc_type_ir::{self as ty, InferCtxtLike, Interner, TypeFoldable};
5
6pub trait SolverDelegate: Deref<Target = Self::Infcx> + Sized {
7 type Infcx: InferCtxtLike<Interner = Self::Interner>;
8 type Interner: Interner;
9 fn cx(&self) -> Self::Interner {
10 (**self).cx()
11 }
12
13 fn build_with_canonical<V>(
14 cx: Self::Interner,
15 canonical: &ty::CanonicalQueryInput<Self::Interner, V>,
16 ) -> (Self, V, ty::CanonicalVarValues<Self::Interner>)
17 where
18 V: TypeFoldable<Self::Interner>;
19
20 fn compute_goal_fast_path(
21 &self,
22 goal: Goal<Self::Interner, <Self::Interner as Interner>::Predicate>,
23 span: <Self::Interner as Interner>::Span,
24 ) -> Option<Certainty>;
25
26 fn fresh_var_for_kind_with_span(
27 &self,
28 arg: <Self::Interner as Interner>::GenericArg,
29 span: <Self::Interner as Interner>::Span,
30 ) -> <Self::Interner as Interner>::GenericArg;
31
32 fn leak_check(&self, max_input_universe: ty::UniverseIndex) -> Result<(), NoSolution>;
34
35 fn evaluate_const(
36 &self,
37 param_env: <Self::Interner as Interner>::ParamEnv,
38 uv: ty::UnevaluatedConst<Self::Interner>,
39 ) -> Option<<Self::Interner as Interner>::Const>;
40
41 fn well_formed_goals(
43 &self,
44 param_env: <Self::Interner as Interner>::ParamEnv,
45 term: <Self::Interner as Interner>::Term,
46 ) -> Option<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>>;
47
48 fn make_deduplicated_outlives_constraints(
49 &self,
50 ) -> Vec<ty::OutlivesPredicate<Self::Interner, <Self::Interner as Interner>::GenericArg>>;
51
52 fn instantiate_canonical<V>(
53 &self,
54 canonical: ty::Canonical<Self::Interner, V>,
55 values: ty::CanonicalVarValues<Self::Interner>,
56 ) -> V
57 where
58 V: TypeFoldable<Self::Interner>;
59
60 fn instantiate_canonical_var_with_infer(
61 &self,
62 kind: ty::CanonicalVarKind<Self::Interner>,
63 span: <Self::Interner as Interner>::Span,
64 universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
65 ) -> <Self::Interner as Interner>::GenericArg;
66 fn add_item_bounds_for_hidden_type(
67 &self,
68 def_id: <Self::Interner as Interner>::DefId,
69 args: <Self::Interner as Interner>::GenericArgs,
70 param_env: <Self::Interner as Interner>::ParamEnv,
71 hidden_ty: <Self::Interner as Interner>::Ty,
72 goals: &mut Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>,
73 );
74
75 fn fetch_eligible_assoc_item(
76 &self,
77 goal_trait_ref: ty::TraitRef<Self::Interner>,
78 trait_assoc_def_id: <Self::Interner as Interner>::DefId,
79 impl_def_id: <Self::Interner as Interner>::DefId,
80 ) -> Result<
81 Option<<Self::Interner as Interner>::DefId>,
82 <Self::Interner as Interner>::ErrorGuaranteed,
83 >;
84
85 fn is_transmutable(
86 &self,
87 dst: <Self::Interner as Interner>::Ty,
88 src: <Self::Interner as Interner>::Ty,
89 assume: <Self::Interner as Interner>::Const,
90 ) -> Result<Certainty, NoSolution>;
91}