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