rustc_next_trait_solver/
delegate.rs1use std::fmt::Debug;
2use std::ops::Deref;
3
4use rustc_type_ir::solve::{
5 ComputeGoalFastPathOutcome, FetchEligibleAssocItemResponse, Goal, NoSolution,
6 VisibleForLeakCheck,
7};
8use rustc_type_ir::transmute::Answer;
9use rustc_type_ir::{
10 self as ty, CanonicalizerState, Const, InferCtxtLike, Interner, Region, TypeFoldable,
11};
12
13pub trait SolverDelegate: Deref<Target = Self::Infcx> + Sized {
30 type Infcx: InferCtxtLike<Interner = Self::Interner>;
31 type Interner: Interner;
32 fn cx(&self) -> Self::Interner {
33 (**self).cx()
34 }
35
36 fn build_with_canonical<V>(
37 cx: Self::Interner,
38 canonical: &ty::CanonicalQueryInput<Self::Interner, V>,
39 ) -> (Self, V, ty::CanonicalVarValues<Self::Interner>)
40 where
41 V: TypeFoldable<Self::Interner>;
42
43 fn compute_goal_fast_path(
44 &self,
45 goal: Goal<Self::Interner, <Self::Interner as Interner>::Predicate>,
46 span: <Self::Interner as Interner>::Span,
47 ) -> ComputeGoalFastPathOutcome<Self::Interner>;
48
49 fn fresh_var_for_kind(
50 &self,
51 arg: <Self::Interner as Interner>::GenericArg,
52 span: <Self::Interner as Interner>::Span,
53 universe: ty::UniverseIndex,
54 ) -> <Self::Interner as Interner>::GenericArg;
55
56 fn leak_check(&self, max_input_universe: ty::UniverseIndex) -> Result<(), NoSolution>;
58
59 fn evaluate_const<E: Debug>(
66 &self,
67 param_env: <Self::Interner as Interner>::ParamEnv,
68 alias_const: ty::AliasConst<Self::Interner>,
69 normalize_ty: impl FnOnce(
70 ty::Unnormalized<Self::Interner, <Self::Interner as Interner>::Ty>,
71 ) -> Result<<Self::Interner as Interner>::Ty, E>,
72 ) -> Result<Option<Const<Self::Interner>>, E>;
73
74 fn well_formed_goals(
76 &self,
77 param_env: <Self::Interner as Interner>::ParamEnv,
78 term: <Self::Interner as Interner>::Term,
79 ) -> Option<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>>;
80
81 fn make_deduplicated_region_constraints(
82 &self,
83 ) -> Vec<(ty::RegionConstraint<Self::Interner>, VisibleForLeakCheck)>;
84
85 fn instantiate_value<V>(
86 &self,
87 value: ty::Canonicalized<V>,
88 values: ty::CanonicalVarValues<Self::Interner>,
89 ) -> V
90 where
91 V: TypeFoldable<Self::Interner>;
92
93 fn instantiate_canonical<V>(
94 &self,
95 canonical: ty::Canonical<Self::Interner, V>,
96 values: ty::CanonicalVarValues<Self::Interner>,
97 ) -> V
98 where
99 V: TypeFoldable<Self::Interner>;
100
101 fn instantiate_canonical_var(
102 &self,
103 kind: ty::CanonicalVarKind<Self::Interner>,
104 span: <Self::Interner as Interner>::Span,
105 prev_var_values: &[<Self::Interner as Interner>::GenericArg],
106 universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
107 ) -> <Self::Interner as Interner>::GenericArg;
108
109 fn add_item_bounds_for_hidden_type(
110 &self,
111 def_id: <Self::Interner as Interner>::OpaqueTyId,
112 args: <Self::Interner as Interner>::GenericArgs,
113 param_env: <Self::Interner as Interner>::ParamEnv,
114 hidden_ty: <Self::Interner as Interner>::Ty,
115 goals: &mut Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>,
116 );
117
118 fn fetch_eligible_assoc_item(
119 &self,
120 goal_trait_ref: ty::TraitRef<Self::Interner>,
121 trait_assoc_def_id: <Self::Interner as Interner>::TraitAssocTermId,
122 impl_def_id: <Self::Interner as Interner>::ImplId,
123 ) -> FetchEligibleAssocItemResponse<Self::Interner>;
124
125 fn is_transmutable(
126 &self,
127 src: <Self::Interner as Interner>::Ty,
128 dst: <Self::Interner as Interner>::Ty,
129 assume: Const<Self::Interner>,
130 ) -> Result<Answer<Region<Self::Interner>, <Self::Interner as Interner>::Ty>, NoSolution>;
131
132 fn obtain_canonicalizer_state(&self) -> Box<CanonicalizerState<Self::Interner>> {
135 Default::default()
136 }
137
138 fn release_canonicalizer_state(&self, _: Box<CanonicalizerState<Self::Interner>>) {}
141
142 fn emit_next_solver_overflow_fcw(
143 &self,
144 goal: Goal<Self::Interner, <Self::Interner as Interner>::Predicate>,
145 span: <Self::Interner as Interner>::Span,
146 );
147}