Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/next_solver/interner.rs')
-rw-r--r--crates/hir-ty/src/next_solver/interner.rs37
1 files changed, 23 insertions, 14 deletions
diff --git a/crates/hir-ty/src/next_solver/interner.rs b/crates/hir-ty/src/next_solver/interner.rs
index a7216a034c..dc30c1e582 100644
--- a/crates/hir-ty/src/next_solver/interner.rs
+++ b/crates/hir-ty/src/next_solver/interner.rs
@@ -29,7 +29,7 @@ use rustc_index::bit_set::DenseBitSet;
use rustc_type_ir::{
AliasTy, BoundVar, CoroutineWitnessTypes, DebruijnIndex, EarlyBinder, FlagComputation, Flags,
FnSigKind, GenericArgKind, GenericTypeVisitable, ImplPolarity, InferTy, Interner, TraitRef,
- TypeFlags, TypeVisitableExt, Upcast, Variance,
+ TypeFlags, TypeVisitableExt, Upcast, Variance, VisitorResult,
elaborate::elaborate,
error::TypeError,
fast_reject,
@@ -54,6 +54,7 @@ use crate::{
TraitAssocTyId, TraitIdWrapper, TypeAliasIdWrapper, UnevaluatedConst, Unnormalized,
util::{explicit_item_bounds, explicit_item_self_bounds},
},
+ ret,
};
use super::{
@@ -1601,12 +1602,12 @@ impl<'db> Interner for DbInterner<'db> {
def_id.0.trait_items(self.db()).associated_types().map(|id| id.into())
}
- fn for_each_relevant_impl(
+ fn for_each_relevant_impl<R: VisitorResult>(
self,
trait_def_id: Self::TraitId,
self_ty: Self::Ty,
- mut f: impl FnMut(Self::ImplId),
- ) {
+ mut f: impl FnMut(Self::ImplId) -> R,
+ ) -> R {
let krate = self.krate.expect("trait solving requires setting `DbInterner::krate`");
let trait_block = trait_def_id.0.loc(self.db).container.block(self.db);
let mut consider_impls_for_simplified_type = |simp: SimplifiedType<'_>| {
@@ -1641,13 +1642,14 @@ impl<'db> Interner for DbInterner<'db> {
let (regular_impls, builtin_derive_impls) =
impls.for_trait_and_self_ty(trait_def_id.0, &simp);
for &impl_ in regular_impls {
- f(impl_.into());
+ ret!(f(impl_.into()));
}
for &impl_ in builtin_derive_impls {
- f(impl_.into());
+ ret!(f(impl_.into()));
}
+ R::output()
},
- );
+ )
};
match self_ty.kind() {
@@ -1676,7 +1678,7 @@ impl<'db> Interner for DbInterner<'db> {
let simp =
fast_reject::simplify_type(self, self_ty, fast_reject::TreatParams::AsRigid)
.unwrap();
- consider_impls_for_simplified_type(simp);
+ ret!(consider_impls_for_simplified_type(simp));
}
// HACK: For integer and float variables we have to manually look at all impls
@@ -1704,7 +1706,7 @@ impl<'db> Interner for DbInterner<'db> {
SimplifiedType::Uint(Usize),
];
for simp in possible_integers {
- consider_impls_for_simplified_type(simp);
+ ret!(consider_impls_for_simplified_type(simp));
}
}
@@ -1719,7 +1721,7 @@ impl<'db> Interner for DbInterner<'db> {
];
for simp in possible_floats {
- consider_impls_for_simplified_type(simp);
+ ret!(consider_impls_for_simplified_type(simp));
}
}
@@ -1748,15 +1750,22 @@ impl<'db> Interner for DbInterner<'db> {
self.for_each_blanket_impl(trait_def_id, f)
}
- fn for_each_blanket_impl(self, trait_def_id: Self::TraitId, mut f: impl FnMut(Self::ImplId)) {
- let Some(krate) = self.krate else { return };
+ fn for_each_blanket_impl<R: VisitorResult>(
+ self,
+ trait_def_id: Self::TraitId,
+ mut f: impl FnMut(Self::ImplId) -> R,
+ ) -> R {
+ let Some(krate) = self.krate else {
+ return R::output();
+ };
let block = trait_def_id.0.loc(self.db).container.block(self.db);
TraitImpls::for_each_crate_and_block(self.db, krate, block, &mut |impls| {
for &impl_ in impls.blanket_impls(trait_def_id.0) {
- f(impl_.into());
+ ret!(f(impl_.into()));
}
- });
+ R::output()
+ })
}
fn has_item_definition(self, _def_id: Self::ImplOrTraitAssocTermId) -> bool {