2024-06-17 15:58:38 +00:00
|
|
|
use rustc_type_ir::fold::TypeFoldable;
|
|
|
|
use rustc_type_ir::relate::Relate;
|
|
|
|
use rustc_type_ir::solve::{Goal, NoSolution};
|
|
|
|
use rustc_type_ir::{self as ty, Interner};
|
2023-11-22 23:44:58 +00:00
|
|
|
|
2024-06-17 15:58:38 +00:00
|
|
|
pub trait SolverDelegate: Sized {
|
2023-11-22 23:44:58 +00:00
|
|
|
type Interner: Interner;
|
|
|
|
|
|
|
|
fn interner(&self) -> Self::Interner;
|
|
|
|
|
2024-05-30 00:15:56 +00:00
|
|
|
fn universe_of_ty(&self, ty: ty::TyVid) -> Option<ty::UniverseIndex>;
|
|
|
|
fn universe_of_lt(&self, lt: ty::RegionVid) -> Option<ty::UniverseIndex>;
|
|
|
|
fn universe_of_ct(&self, ct: ty::ConstVid) -> Option<ty::UniverseIndex>;
|
2023-11-22 23:44:58 +00:00
|
|
|
|
2024-06-12 22:35:51 +00:00
|
|
|
fn root_ty_var(&self, var: ty::TyVid) -> ty::TyVid;
|
|
|
|
fn root_const_var(&self, var: ty::ConstVid) -> ty::ConstVid;
|
|
|
|
|
2024-05-30 00:15:56 +00:00
|
|
|
fn opportunistic_resolve_ty_var(&self, vid: ty::TyVid) -> <Self::Interner as Interner>::Ty;
|
|
|
|
fn opportunistic_resolve_int_var(&self, vid: ty::IntVid) -> <Self::Interner as Interner>::Ty;
|
|
|
|
fn opportunistic_resolve_float_var(
|
|
|
|
&self,
|
|
|
|
vid: ty::FloatVid,
|
|
|
|
) -> <Self::Interner as Interner>::Ty;
|
|
|
|
fn opportunistic_resolve_ct_var(
|
|
|
|
&self,
|
|
|
|
vid: ty::ConstVid,
|
|
|
|
) -> <Self::Interner as Interner>::Const;
|
2024-05-19 17:04:44 +00:00
|
|
|
fn opportunistic_resolve_effect_var(
|
|
|
|
&self,
|
2024-05-30 00:15:56 +00:00
|
|
|
vid: ty::EffectVid,
|
2024-05-19 17:04:44 +00:00
|
|
|
) -> <Self::Interner as Interner>::Const;
|
2024-05-30 00:15:56 +00:00
|
|
|
fn opportunistic_resolve_lt_var(
|
|
|
|
&self,
|
|
|
|
vid: ty::RegionVid,
|
|
|
|
) -> <Self::Interner as Interner>::Region;
|
2024-03-06 10:21:27 +00:00
|
|
|
|
2024-03-07 10:29:11 +00:00
|
|
|
fn defining_opaque_types(&self) -> <Self::Interner as Interner>::DefiningOpaqueTypes;
|
2024-05-30 00:15:56 +00:00
|
|
|
|
2024-06-12 21:48:37 +00:00
|
|
|
fn next_ty_infer(&self) -> <Self::Interner as Interner>::Ty;
|
|
|
|
fn next_const_infer(&self) -> <Self::Interner as Interner>::Const;
|
|
|
|
fn fresh_args_for_item(
|
|
|
|
&self,
|
|
|
|
def_id: <Self::Interner as Interner>::DefId,
|
|
|
|
) -> <Self::Interner as Interner>::GenericArgs;
|
|
|
|
|
2024-05-30 00:15:56 +00:00
|
|
|
fn instantiate_binder_with_infer<T: TypeFoldable<Self::Interner> + Copy>(
|
|
|
|
&self,
|
|
|
|
value: ty::Binder<Self::Interner, T>,
|
|
|
|
) -> T;
|
|
|
|
|
|
|
|
fn enter_forall<T: TypeFoldable<Self::Interner> + Copy, U>(
|
|
|
|
&self,
|
|
|
|
value: ty::Binder<Self::Interner, T>,
|
|
|
|
f: impl FnOnce(T) -> U,
|
|
|
|
) -> U;
|
2024-06-12 21:48:37 +00:00
|
|
|
|
|
|
|
fn relate<T: Relate<Self::Interner>>(
|
|
|
|
&self,
|
|
|
|
param_env: <Self::Interner as Interner>::ParamEnv,
|
|
|
|
lhs: T,
|
|
|
|
variance: ty::Variance,
|
|
|
|
rhs: T,
|
|
|
|
) -> Result<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>, NoSolution>;
|
|
|
|
|
|
|
|
fn eq_structurally_relating_aliases<T: Relate<Self::Interner>>(
|
|
|
|
&self,
|
|
|
|
param_env: <Self::Interner as Interner>::ParamEnv,
|
|
|
|
lhs: T,
|
|
|
|
rhs: T,
|
|
|
|
) -> Result<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>, NoSolution>;
|
|
|
|
|
|
|
|
fn resolve_vars_if_possible<T>(&self, value: T) -> T
|
|
|
|
where
|
|
|
|
T: TypeFoldable<Self::Interner>;
|
2024-06-14 20:04:45 +00:00
|
|
|
|
|
|
|
fn probe<T>(&self, probe: impl FnOnce() -> T) -> T;
|
2023-11-22 23:44:58 +00:00
|
|
|
}
|