Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/method_resolution.rs')
-rw-r--r--crates/hir-ty/src/method_resolution.rs103
1 files changed, 56 insertions, 47 deletions
diff --git a/crates/hir-ty/src/method_resolution.rs b/crates/hir-ty/src/method_resolution.rs
index c5868ab6b5..e8702bf2c9 100644
--- a/crates/hir-ty/src/method_resolution.rs
+++ b/crates/hir-ty/src/method_resolution.rs
@@ -11,10 +11,11 @@ mod probe;
use either::Either;
use hir_expand::name::Name;
+use salsa::Update;
use span::Edition;
use tracing::{debug, instrument};
-use base_db::Crate;
+use base_db::{Crate, salsa::update_fallback_db};
use hir_def::{
AssocItemId, BlockIdLt, BuiltinDeriveImplId, ConstId, FunctionId, GenericParamId, HasModule,
ImplId, ItemContainerId, ModuleId, TraitId,
@@ -125,7 +126,7 @@ pub enum CandidateSource {
Trait(TraitId),
}
-impl<'a, 'db> InferenceContext<'a, 'db> {
+impl<'db> InferenceContext<'db> {
/// Performs method lookup. If lookup is successful, it will return the callee
/// and store an appropriate adjustment for the self-expr. In some cases it may
/// report an error (e.g., invoking the `drop` method).
@@ -522,10 +523,10 @@ fn crates_containing_incoherent_inherent_impls(db: &dyn HirDatabase, krate: Crat
krate.transitive_deps(db).into_iter().filter(|krate| krate.data(db).origin.is_lang()).collect()
}
-pub fn with_incoherent_inherent_impls(
- db: &dyn HirDatabase,
+pub fn with_incoherent_inherent_impls<'db>(
+ db: &'db dyn HirDatabase,
krate: Crate,
- self_ty: &SimplifiedType,
+ self_ty: &SimplifiedType<'db>,
mut callback: impl FnMut(&[ImplId]),
) {
let has_incoherent_impls = match self_ty.def() {
@@ -547,7 +548,7 @@ pub fn with_incoherent_inherent_impls(
}
}
-pub fn simplified_type_module(db: &dyn HirDatabase, ty: &SimplifiedType) -> Option<ModuleId> {
+pub fn simplified_type_module(db: &dyn HirDatabase, ty: &SimplifiedType<'_>) -> Option<ModuleId> {
match ty.def()? {
SolverDefId::AdtId(id) => Some(id.module(db)),
SolverDefId::TypeAliasId(id) => Some(id.module(db)),
@@ -556,15 +557,16 @@ pub fn simplified_type_module(db: &dyn HirDatabase, ty: &SimplifiedType) -> Opti
}
}
-#[derive(Debug, PartialEq, Eq)]
-pub struct InherentImpls {
- map: FxHashMap<SimplifiedType, Box<[ImplId]>>,
+#[derive(Debug, PartialEq, Eq, Update)]
+pub struct InherentImpls<'db> {
+ #[update(bounds(SolverDefId<'db>: Update), unsafe(with(update_fallback_db::<'db, _>)))]
+ map: FxHashMap<SimplifiedType<'db>, Box<[ImplId]>>,
}
#[salsa::tracked]
-impl<'db> InherentImpls {
+impl<'db> InherentImpls<'db> {
#[salsa::tracked(returns(ref))]
- pub fn for_crate(db: &'db dyn HirDatabase, krate: Crate) -> Self {
+ pub fn for_crate(db: &'db dyn HirDatabase, krate: Crate) -> InherentImpls<'db> {
let _p = tracing::info_span!("inherent_impls_in_crate_query", ?krate).entered();
let crate_def_map = crate_def_map(db, krate);
@@ -573,7 +575,10 @@ impl<'db> InherentImpls {
}
#[salsa::tracked(returns(ref))]
- pub fn for_block(db: &'db dyn HirDatabase, block: BlockIdLt<'db>) -> Option<Box<Self>> {
+ pub fn for_block(
+ db: &'db dyn HirDatabase,
+ block: BlockIdLt<'db>,
+ ) -> Option<Box<InherentImpls<'db>>> {
let _p = tracing::info_span!("inherent_impls_in_block_query").entered();
let block_def_map = block_def_map(db, block);
@@ -582,8 +587,8 @@ impl<'db> InherentImpls {
}
}
-impl InherentImpls {
- fn collect_def_map(db: &dyn HirDatabase, def_map: &DefMap) -> Self {
+impl<'db> InherentImpls<'db> {
+ fn collect_def_map(db: &'db dyn HirDatabase, def_map: &'db DefMap) -> Self {
let mut map = FxHashMap::default();
collect(db, def_map, &mut map);
let mut map = map
@@ -593,10 +598,10 @@ impl InherentImpls {
map.shrink_to_fit();
return Self { map };
- fn collect(
- db: &dyn HirDatabase,
+ fn collect<'db>(
+ db: &'db dyn HirDatabase,
def_map: &DefMap,
- map: &mut FxHashMap<SimplifiedType, Vec<ImplId>>,
+ map: &mut FxHashMap<SimplifiedType<'db>, Vec<ImplId>>,
) {
for (_module_id, module_data) in def_map.modules() {
for impl_id in module_data.scope.inherent_impls() {
@@ -622,15 +627,15 @@ impl InherentImpls {
}
}
- pub fn for_self_ty(&self, self_ty: &SimplifiedType) -> &[ImplId] {
+ pub fn for_self_ty(&self, self_ty: &SimplifiedType<'db>) -> &[ImplId] {
self.map.get(self_ty).map(|it| &**it).unwrap_or_default()
}
- pub fn for_each_crate_and_block<'db>(
+ pub fn for_each_crate_and_block(
db: &'db dyn HirDatabase,
krate: Crate,
block: Option<BlockIdLt<'db>>,
- for_each: &mut dyn FnMut(&InherentImpls),
+ for_each: &mut dyn FnMut(&InherentImpls<'db>),
) {
let blocks = std::iter::successors(block, |block| block.module(db).block(db));
blocks.filter_map(|block| Self::for_block(db, block).as_deref()).for_each(&mut *for_each);
@@ -638,20 +643,21 @@ impl InherentImpls {
}
}
-#[derive(Debug, PartialEq)]
-struct OneTraitImpls {
- non_blanket_impls: FxHashMap<SimplifiedType, (Box<[ImplId]>, Box<[BuiltinDeriveImplId]>)>,
+#[derive(Debug, PartialEq, Update)]
+struct OneTraitImpls<'db> {
+ #[update(bounds(SolverDefId<'db>: Update), unsafe(with(update_fallback_db::<'db, _>)))]
+ non_blanket_impls: FxHashMap<SimplifiedType<'db>, (Box<[ImplId]>, Box<[BuiltinDeriveImplId]>)>,
blanket_impls: Box<[ImplId]>,
}
#[derive(Default)]
-struct OneTraitImplsBuilder {
- non_blanket_impls: FxHashMap<SimplifiedType, (Vec<ImplId>, Vec<BuiltinDeriveImplId>)>,
+struct OneTraitImplsBuilder<'db> {
+ non_blanket_impls: FxHashMap<SimplifiedType<'db>, (Vec<ImplId>, Vec<BuiltinDeriveImplId>)>,
blanket_impls: Vec<ImplId>,
}
-impl OneTraitImplsBuilder {
- fn finish(self) -> OneTraitImpls {
+impl<'db> OneTraitImplsBuilder<'db> {
+ fn finish(self) -> OneTraitImpls<'db> {
let mut non_blanket_impls = self
.non_blanket_impls
.into_iter()
@@ -665,15 +671,15 @@ impl OneTraitImplsBuilder {
}
}
-#[derive(Debug, PartialEq)]
-pub struct TraitImpls {
- map: FxHashMap<TraitId, OneTraitImpls>,
+#[derive(Debug, PartialEq, Update)]
+pub struct TraitImpls<'db> {
+ map: FxHashMap<TraitId, OneTraitImpls<'db>>,
}
#[salsa::tracked]
-impl<'db> TraitImpls {
+impl<'db> TraitImpls<'db> {
#[salsa::tracked(returns(ref))]
- pub fn for_crate(db: &'db dyn HirDatabase, krate: Crate) -> Arc<Self> {
+ pub fn for_crate(db: &'db dyn HirDatabase, krate: Crate) -> Arc<TraitImpls<'db>> {
let _p = tracing::info_span!("inherent_impls_in_crate_query", ?krate).entered();
let crate_def_map = crate_def_map(db, krate);
@@ -682,7 +688,10 @@ impl<'db> TraitImpls {
}
#[salsa::tracked(returns(as_deref))]
- pub fn for_block(db: &'db dyn HirDatabase, block: BlockIdLt<'db>) -> Option<Box<Self>> {
+ pub fn for_block(
+ db: &'db dyn HirDatabase,
+ block: BlockIdLt<'db>,
+ ) -> Option<Box<TraitImpls<'db>>> {
let _p = tracing::info_span!("inherent_impls_in_block_query").entered();
let block_def_map = block_def_map(db, block);
@@ -696,8 +705,8 @@ impl<'db> TraitImpls {
}
}
-impl TraitImpls {
- fn collect_def_map(db: &dyn HirDatabase, def_map: &DefMap) -> Self {
+impl<'db> TraitImpls<'db> {
+ fn collect_def_map(db: &'db dyn HirDatabase, def_map: &DefMap) -> Self {
let lang_items = hir_def::lang_item::lang_items(db, def_map.krate());
let mut map = FxHashMap::default();
collect(db, def_map, lang_items, &mut map);
@@ -708,11 +717,11 @@ impl TraitImpls {
map.shrink_to_fit();
return Self { map };
- fn collect(
- db: &dyn HirDatabase,
+ fn collect<'db>(
+ db: &'db dyn HirDatabase,
def_map: &DefMap,
lang_items: &LangItems,
- map: &mut FxHashMap<TraitId, OneTraitImplsBuilder>,
+ map: &mut FxHashMap<TraitId, OneTraitImplsBuilder<'db>>,
) {
for (_module_id, module_data) in def_map.modules() {
for impl_id in module_data.scope.trait_impls() {
@@ -779,7 +788,7 @@ impl TraitImpls {
pub fn has_impls_for_trait_and_self_ty(
&self,
trait_: TraitId,
- self_ty: &SimplifiedType,
+ self_ty: &SimplifiedType<'db>,
) -> bool {
self.map.get(&trait_).is_some_and(|trait_impls| {
trait_impls.non_blanket_impls.contains_key(self_ty)
@@ -788,10 +797,10 @@ impl TraitImpls {
}
pub fn for_trait_and_self_ty(
- &self,
+ &'db self,
trait_: TraitId,
- self_ty: &SimplifiedType,
- ) -> (&[ImplId], &[BuiltinDeriveImplId]) {
+ self_ty: &SimplifiedType<'db>,
+ ) -> (&'db [ImplId], &'db [BuiltinDeriveImplId]) {
self.map
.get(&trait_)
.and_then(|map| map.non_blanket_impls.get(self_ty))
@@ -815,7 +824,7 @@ impl TraitImpls {
pub fn for_self_ty(
&self,
- self_ty: &SimplifiedType,
+ self_ty: &SimplifiedType<'db>,
mut callback: impl FnMut(Either<&[ImplId], &[BuiltinDeriveImplId]>),
) {
for for_trait in self.map.values() {
@@ -826,11 +835,11 @@ impl TraitImpls {
}
}
- pub fn for_each_crate_and_block<'db>(
+ pub fn for_each_crate_and_block(
db: &'db dyn HirDatabase,
krate: Crate,
block: Option<BlockIdLt<'db>>,
- for_each: &mut dyn FnMut(&TraitImpls),
+ for_each: &mut dyn FnMut(&TraitImpls<'db>),
) {
let blocks = std::iter::successors(block, |block| block.module(db).block(db));
blocks.filter_map(|block| Self::for_block(db, block)).for_each(&mut *for_each);
@@ -838,12 +847,12 @@ impl TraitImpls {
}
/// Like [`Self::for_each_crate_and_block()`], but takes in account two blocks, one for a trait and one for a self type.
- pub fn for_each_crate_and_block_trait_and_type<'db>(
+ pub fn for_each_crate_and_block_trait_and_type(
db: &'db dyn HirDatabase,
krate: Crate,
type_block: Option<BlockIdLt<'db>>,
trait_block: Option<BlockIdLt<'db>>,
- for_each: &mut dyn FnMut(&TraitImpls),
+ for_each: &mut dyn FnMut(&TraitImpls<'db>),
) {
let in_self_and_deps = TraitImpls::for_crate_and_deps(db, krate);
in_self_and_deps.iter().for_each(|impls| for_each(impls));