simplify Interner opaque types API
This commit is contained in:
parent
5f74fa02af
commit
cb275d4f26
7 changed files with 26 additions and 47 deletions
|
@ -62,14 +62,12 @@ pub trait SolverDelegate: Deref<Target = Self::Infcx> + Sized {
|
|||
universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
|
||||
) -> <Self::Interner as Interner>::GenericArg;
|
||||
|
||||
// FIXME: Can we implement this in terms of `add` and `inject`?
|
||||
fn insert_hidden_type(
|
||||
fn register_hidden_type_in_storage(
|
||||
&self,
|
||||
opaque_type_key: ty::OpaqueTypeKey<Self::Interner>,
|
||||
param_env: <Self::Interner as Interner>::ParamEnv,
|
||||
hidden_ty: <Self::Interner as Interner>::Ty,
|
||||
goals: &mut Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>,
|
||||
) -> Result<(), NoSolution>;
|
||||
span: <Self::Interner as Interner>::Span,
|
||||
) -> Option<<Self::Interner as Interner>::Ty>;
|
||||
|
||||
fn add_item_bounds_for_hidden_type(
|
||||
&self,
|
||||
|
@ -79,14 +77,6 @@ pub trait SolverDelegate: Deref<Target = Self::Infcx> + Sized {
|
|||
hidden_ty: <Self::Interner as Interner>::Ty,
|
||||
goals: &mut Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>,
|
||||
);
|
||||
|
||||
fn inject_new_hidden_type_unchecked(
|
||||
&self,
|
||||
key: ty::OpaqueTypeKey<Self::Interner>,
|
||||
hidden_ty: <Self::Interner as Interner>::Ty,
|
||||
span: <Self::Interner as Interner>::Span,
|
||||
);
|
||||
|
||||
fn reset_opaque_types(&self);
|
||||
|
||||
fn fetch_eligible_assoc_item(
|
||||
|
|
|
@ -425,7 +425,8 @@ where
|
|||
|
||||
fn register_new_opaque_types(&mut self, opaque_types: &[(ty::OpaqueTypeKey<I>, I::Ty)]) {
|
||||
for &(key, ty) in opaque_types {
|
||||
self.delegate.inject_new_hidden_type_unchecked(key, ty, self.origin_span);
|
||||
let prev = self.delegate.register_hidden_type_in_storage(key, ty, self.origin_span);
|
||||
assert_eq!(prev, None);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -387,7 +387,8 @@ where
|
|||
};
|
||||
|
||||
for &(key, ty) in &input.predefined_opaques_in_body.opaque_types {
|
||||
ecx.delegate.inject_new_hidden_type_unchecked(key, ty, ecx.origin_span);
|
||||
let prev = ecx.delegate.register_hidden_type_in_storage(key, ty, ecx.origin_span);
|
||||
assert_eq!(prev, None);
|
||||
}
|
||||
|
||||
if !ecx.nested_goals.is_empty() {
|
||||
|
@ -1070,16 +1071,12 @@ where
|
|||
self.delegate.fetch_eligible_assoc_item(goal_trait_ref, trait_assoc_def_id, impl_def_id)
|
||||
}
|
||||
|
||||
pub(super) fn insert_hidden_type(
|
||||
pub(super) fn register_hidden_type_in_storage(
|
||||
&mut self,
|
||||
opaque_type_key: ty::OpaqueTypeKey<I>,
|
||||
param_env: I::ParamEnv,
|
||||
hidden_ty: I::Ty,
|
||||
) -> Result<(), NoSolution> {
|
||||
let mut goals = Vec::new();
|
||||
self.delegate.insert_hidden_type(opaque_type_key, param_env, hidden_ty, &mut goals)?;
|
||||
self.add_goals(GoalSource::Misc, goals);
|
||||
Ok(())
|
||||
) -> Option<I::Ty> {
|
||||
self.delegate.register_hidden_type_in_storage(opaque_type_key, hidden_ty, self.origin_span)
|
||||
}
|
||||
|
||||
pub(super) fn add_item_bounds_for_hidden_type(
|
||||
|
|
|
@ -86,8 +86,8 @@ where
|
|||
}
|
||||
|
||||
// Otherwise, define a new opaque type
|
||||
// FIXME: should we use `inject_hidden_type_unchecked` here?
|
||||
self.insert_hidden_type(opaque_type_key, goal.param_env, expected)?;
|
||||
let prev = self.register_hidden_type_in_storage(opaque_type_key, expected);
|
||||
assert_eq!(prev, None);
|
||||
self.add_item_bounds_for_hidden_type(
|
||||
def_id.into(),
|
||||
opaque_ty.args,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue