1use derive_where::derive_where;
2#[cfg(feature = "nightly")]
3use rustc_macros::{Decodable_NoContext, Encodable_NoContext, HashStable_NoContext};
4use rustc_type_ir_macros::{TypeFoldable_Generic, TypeVisitable_Generic};
5
6use crate::fold::TypeFoldable;
7use crate::inherent::*;
8use crate::relate::RelateResult;
9use crate::relate::combine::PredicateEmittingRelation;
10use crate::{self as ty, Interner};
11
12#[derive_where(Clone, Copy, Hash, PartialEq, Eq, Debug; I: Interner)]
23#[derive(TypeVisitable_Generic, TypeFoldable_Generic)]
24#[cfg_attr(
25 feature = "nightly",
26 derive(Encodable_NoContext, Decodable_NoContext, HashStable_NoContext)
27)]
28pub enum TypingMode<I: Interner> {
29 Coherence,
41 Analysis { defining_opaque_types_and_generators: I::LocalDefIds },
70 Borrowck { defining_opaque_types: I::LocalDefIds },
78 PostBorrowckAnalysis { defined_opaque_types: I::LocalDefIds },
84 PostAnalysis,
93}
94
95impl<I: Interner> TypingMode<I> {
96 pub fn non_body_analysis() -> TypingMode<I> {
98 TypingMode::Analysis { defining_opaque_types_and_generators: Default::default() }
99 }
100
101 pub fn typeck_for_body(cx: I, body_def_id: I::LocalDefId) -> TypingMode<I> {
102 TypingMode::Analysis {
103 defining_opaque_types_and_generators: cx
104 .opaque_types_and_coroutines_defined_by(body_def_id),
105 }
106 }
107
108 pub fn analysis_in_body(cx: I, body_def_id: I::LocalDefId) -> TypingMode<I> {
114 TypingMode::Analysis {
115 defining_opaque_types_and_generators: cx.opaque_types_defined_by(body_def_id),
116 }
117 }
118
119 pub fn borrowck(cx: I, body_def_id: I::LocalDefId) -> TypingMode<I> {
120 TypingMode::Borrowck { defining_opaque_types: cx.opaque_types_defined_by(body_def_id) }
121 }
122
123 pub fn post_borrowck_analysis(cx: I, body_def_id: I::LocalDefId) -> TypingMode<I> {
124 TypingMode::PostBorrowckAnalysis {
125 defined_opaque_types: cx.opaque_types_defined_by(body_def_id),
126 }
127 }
128}
129
130#[cfg_attr(feature = "nightly", rustc_diagnostic_item = "type_ir_infer_ctxt_like")]
131pub trait InferCtxtLike: Sized {
132 type Interner: Interner;
133 fn cx(&self) -> Self::Interner;
134
135 fn next_trait_solver(&self) -> bool {
140 true
141 }
142
143 fn typing_mode(&self) -> TypingMode<Self::Interner>;
144
145 fn universe(&self) -> ty::UniverseIndex;
146 fn create_next_universe(&self) -> ty::UniverseIndex;
147
148 fn universe_of_ty(&self, ty: ty::TyVid) -> Option<ty::UniverseIndex>;
149 fn universe_of_lt(&self, lt: ty::RegionVid) -> Option<ty::UniverseIndex>;
150 fn universe_of_ct(&self, ct: ty::ConstVid) -> Option<ty::UniverseIndex>;
151
152 fn root_ty_var(&self, var: ty::TyVid) -> ty::TyVid;
153 fn root_const_var(&self, var: ty::ConstVid) -> ty::ConstVid;
154
155 fn opportunistic_resolve_ty_var(&self, vid: ty::TyVid) -> <Self::Interner as Interner>::Ty;
156 fn opportunistic_resolve_int_var(&self, vid: ty::IntVid) -> <Self::Interner as Interner>::Ty;
157 fn opportunistic_resolve_float_var(
158 &self,
159 vid: ty::FloatVid,
160 ) -> <Self::Interner as Interner>::Ty;
161 fn opportunistic_resolve_ct_var(
162 &self,
163 vid: ty::ConstVid,
164 ) -> <Self::Interner as Interner>::Const;
165 fn opportunistic_resolve_lt_var(
166 &self,
167 vid: ty::RegionVid,
168 ) -> <Self::Interner as Interner>::Region;
169
170 fn is_changed_arg(&self, arg: <Self::Interner as Interner>::GenericArg) -> bool;
171
172 fn next_region_infer(&self) -> <Self::Interner as Interner>::Region;
173 fn next_ty_infer(&self) -> <Self::Interner as Interner>::Ty;
174 fn next_const_infer(&self) -> <Self::Interner as Interner>::Const;
175 fn fresh_args_for_item(
176 &self,
177 def_id: <Self::Interner as Interner>::DefId,
178 ) -> <Self::Interner as Interner>::GenericArgs;
179
180 fn instantiate_binder_with_infer<T: TypeFoldable<Self::Interner> + Copy>(
181 &self,
182 value: ty::Binder<Self::Interner, T>,
183 ) -> T;
184
185 fn enter_forall<T: TypeFoldable<Self::Interner>, U>(
186 &self,
187 value: ty::Binder<Self::Interner, T>,
188 f: impl FnOnce(T) -> U,
189 ) -> U;
190
191 fn equate_ty_vids_raw(&self, a: ty::TyVid, b: ty::TyVid);
192 fn equate_int_vids_raw(&self, a: ty::IntVid, b: ty::IntVid);
193 fn equate_float_vids_raw(&self, a: ty::FloatVid, b: ty::FloatVid);
194 fn equate_const_vids_raw(&self, a: ty::ConstVid, b: ty::ConstVid);
195
196 fn instantiate_ty_var_raw<R: PredicateEmittingRelation<Self>>(
197 &self,
198 relation: &mut R,
199 target_is_expected: bool,
200 target_vid: ty::TyVid,
201 instantiation_variance: ty::Variance,
202 source_ty: <Self::Interner as Interner>::Ty,
203 ) -> RelateResult<Self::Interner, ()>;
204 fn instantiate_int_var_raw(&self, vid: ty::IntVid, value: ty::IntVarValue);
205 fn instantiate_float_var_raw(&self, vid: ty::FloatVid, value: ty::FloatVarValue);
206 fn instantiate_const_var_raw<R: PredicateEmittingRelation<Self>>(
207 &self,
208 relation: &mut R,
209 target_is_expected: bool,
210 target_vid: ty::ConstVid,
211 source_ct: <Self::Interner as Interner>::Const,
212 ) -> RelateResult<Self::Interner, ()>;
213
214 fn set_tainted_by_errors(&self, e: <Self::Interner as Interner>::ErrorGuaranteed);
215
216 fn shallow_resolve(
217 &self,
218 ty: <Self::Interner as Interner>::Ty,
219 ) -> <Self::Interner as Interner>::Ty;
220 fn shallow_resolve_const(
221 &self,
222 ty: <Self::Interner as Interner>::Const,
223 ) -> <Self::Interner as Interner>::Const;
224
225 fn resolve_vars_if_possible<T>(&self, value: T) -> T
226 where
227 T: TypeFoldable<Self::Interner>;
228
229 fn probe<T>(&self, probe: impl FnOnce() -> T) -> T;
230
231 fn sub_regions(
232 &self,
233 sub: <Self::Interner as Interner>::Region,
234 sup: <Self::Interner as Interner>::Region,
235 span: <Self::Interner as Interner>::Span,
236 );
237
238 fn equate_regions(
239 &self,
240 a: <Self::Interner as Interner>::Region,
241 b: <Self::Interner as Interner>::Region,
242 span: <Self::Interner as Interner>::Span,
243 );
244
245 fn register_ty_outlives(
246 &self,
247 ty: <Self::Interner as Interner>::Ty,
248 r: <Self::Interner as Interner>::Region,
249 span: <Self::Interner as Interner>::Span,
250 );
251
252 type OpaqueTypeStorageEntries: OpaqueTypeStorageEntries;
253 fn opaque_types_storage_num_entries(&self) -> Self::OpaqueTypeStorageEntries;
254 fn clone_opaque_types_lookup_table(
255 &self,
256 ) -> Vec<(ty::OpaqueTypeKey<Self::Interner>, <Self::Interner as Interner>::Ty)>;
257 fn clone_duplicate_opaque_types(
258 &self,
259 ) -> Vec<(ty::OpaqueTypeKey<Self::Interner>, <Self::Interner as Interner>::Ty)>;
260 fn clone_opaque_types_added_since(
261 &self,
262 prev_entries: Self::OpaqueTypeStorageEntries,
263 ) -> Vec<(ty::OpaqueTypeKey<Self::Interner>, <Self::Interner as Interner>::Ty)>;
264
265 fn register_hidden_type_in_storage(
266 &self,
267 opaque_type_key: ty::OpaqueTypeKey<Self::Interner>,
268 hidden_ty: <Self::Interner as Interner>::Ty,
269 span: <Self::Interner as Interner>::Span,
270 ) -> Option<<Self::Interner as Interner>::Ty>;
271 fn add_duplicate_opaque_type(
272 &self,
273 opaque_type_key: ty::OpaqueTypeKey<Self::Interner>,
274 hidden_ty: <Self::Interner as Interner>::Ty,
275 span: <Self::Interner as Interner>::Span,
276 );
277
278 fn reset_opaque_types(&self);
279}