aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/method_resolution.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_ty/src/method_resolution.rs')
-rw-r--r--crates/ra_hir_ty/src/method_resolution.rs23
1 files changed, 11 insertions, 12 deletions
diff --git a/crates/ra_hir_ty/src/method_resolution.rs b/crates/ra_hir_ty/src/method_resolution.rs
index 988d83af5..df5901835 100644
--- a/crates/ra_hir_ty/src/method_resolution.rs
+++ b/crates/ra_hir_ty/src/method_resolution.rs
@@ -42,19 +42,19 @@ impl TyFingerprint {
42} 42}
43 43
44#[derive(Debug, PartialEq, Eq)] 44#[derive(Debug, PartialEq, Eq)]
45pub struct CrateImplBlocks { 45pub struct CrateImplDefs {
46 impls: FxHashMap<TyFingerprint, Vec<ImplId>>, 46 impls: FxHashMap<TyFingerprint, Vec<ImplId>>,
47 impls_by_trait: FxHashMap<TraitId, Vec<ImplId>>, 47 impls_by_trait: FxHashMap<TraitId, Vec<ImplId>>,
48} 48}
49 49
50impl CrateImplBlocks { 50impl CrateImplDefs {
51 pub(crate) fn impls_in_crate_query( 51 pub(crate) fn impls_in_crate_query(
52 db: &impl HirDatabase, 52 db: &impl HirDatabase,
53 krate: CrateId, 53 krate: CrateId,
54 ) -> Arc<CrateImplBlocks> { 54 ) -> Arc<CrateImplDefs> {
55 let _p = profile("impls_in_crate_query"); 55 let _p = profile("impls_in_crate_query");
56 let mut res = 56 let mut res =
57 CrateImplBlocks { impls: FxHashMap::default(), impls_by_trait: FxHashMap::default() }; 57 CrateImplDefs { impls: FxHashMap::default(), impls_by_trait: FxHashMap::default() };
58 58
59 let crate_def_map = db.crate_def_map(krate); 59 let crate_def_map = db.crate_def_map(krate);
60 for (_module_id, module_data) in crate_def_map.modules.iter() { 60 for (_module_id, module_data) in crate_def_map.modules.iter() {
@@ -75,12 +75,12 @@ impl CrateImplBlocks {
75 75
76 Arc::new(res) 76 Arc::new(res)
77 } 77 }
78 pub fn lookup_impl_blocks(&self, ty: &Ty) -> impl Iterator<Item = ImplId> + '_ { 78 pub fn lookup_impl_defs(&self, ty: &Ty) -> impl Iterator<Item = ImplId> + '_ {
79 let fingerprint = TyFingerprint::for_impl(ty); 79 let fingerprint = TyFingerprint::for_impl(ty);
80 fingerprint.and_then(|f| self.impls.get(&f)).into_iter().flatten().copied() 80 fingerprint.and_then(|f| self.impls.get(&f)).into_iter().flatten().copied()
81 } 81 }
82 82
83 pub fn lookup_impl_blocks_for_trait(&self, tr: TraitId) -> impl Iterator<Item = ImplId> + '_ { 83 pub fn lookup_impl_defs_for_trait(&self, tr: TraitId) -> impl Iterator<Item = ImplId> + '_ {
84 self.impls_by_trait.get(&tr).into_iter().flatten().copied() 84 self.impls_by_trait.get(&tr).into_iter().flatten().copied()
85 } 85 }
86 86
@@ -131,7 +131,7 @@ impl Ty {
131 let res = lang_item_targets 131 let res = lang_item_targets
132 .into_iter() 132 .into_iter()
133 .filter_map(|it| match it { 133 .filter_map(|it| match it {
134 LangItemTarget::ImplBlockId(it) => Some(it), 134 LangItemTarget::ImplDefId(it) => Some(it),
135 _ => None, 135 _ => None,
136 }) 136 })
137 .map(|it| it.lookup(db).container.module(db).krate) 137 .map(|it| it.lookup(db).container.module(db).krate)
@@ -177,7 +177,7 @@ pub enum LookupMode {
177} 177}
178 178
179// This would be nicer if it just returned an iterator, but that runs into 179// This would be nicer if it just returned an iterator, but that runs into
180// lifetime problems, because we need to borrow temp `CrateImplBlocks`. 180// lifetime problems, because we need to borrow temp `CrateImplDefs`.
181// FIXME add a context type here? 181// FIXME add a context type here?
182pub fn iterate_method_candidates<T>( 182pub fn iterate_method_candidates<T>(
183 ty: &Canonical<Ty>, 183 ty: &Canonical<Ty>,
@@ -425,8 +425,8 @@ fn iterate_inherent_methods<T>(
425 for krate in self_ty.value.def_crates(db, krate)? { 425 for krate in self_ty.value.def_crates(db, krate)? {
426 let impls = db.impls_in_crate(krate); 426 let impls = db.impls_in_crate(krate);
427 427
428 for impl_block in impls.lookup_impl_blocks(&self_ty.value) { 428 for impl_def in impls.lookup_impl_defs(&self_ty.value) {
429 for &item in db.impl_data(impl_block).items.iter() { 429 for &item in db.impl_data(impl_def).items.iter() {
430 if !is_valid_candidate(db, name, receiver_ty, item, self_ty) { 430 if !is_valid_candidate(db, name, receiver_ty, item, self_ty) {
431 continue; 431 continue;
432 } 432 }
@@ -434,8 +434,7 @@ fn iterate_inherent_methods<T>(
434 // that the impl is for. If we have a receiver type, this 434 // that the impl is for. If we have a receiver type, this
435 // already happens in `is_valid_candidate` above; if not, we 435 // already happens in `is_valid_candidate` above; if not, we
436 // check it here 436 // check it here
437 if receiver_ty.is_none() && inherent_impl_substs(db, impl_block, self_ty).is_none() 437 if receiver_ty.is_none() && inherent_impl_substs(db, impl_def, self_ty).is_none() {
438 {
439 test_utils::tested_by!(impl_self_type_match_without_receiver); 438 test_utils::tested_by!(impl_self_type_match_without_receiver);
440 continue; 439 continue;
441 } 440 }