diff options
Diffstat (limited to 'crates/ra_hir_ty/src/method_resolution.rs')
-rw-r--r-- | crates/ra_hir_ty/src/method_resolution.rs | 23 |
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)] |
45 | pub struct CrateImplBlocks { | 45 | pub 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 | ||
50 | impl CrateImplBlocks { | 50 | impl 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? |
182 | pub fn iterate_method_candidates<T>( | 182 | pub 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 | } |