From 6bde542a39fe63298a31b838e59705797ed8a2cf Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Wed, 1 Jul 2020 17:15:20 +0200 Subject: Split `CrateImplDefs` in inherent and trait impls This makes the intention of inherent vs. trait impls somewhat more clear and also fixes (?) an issue where trait impls with an unresolved trait were added as inherent impls instead (hence the test changes). --- crates/ra_hir/src/code_model.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'crates/ra_hir/src/code_model.rs') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index e09eb77c2..cc72964ff 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -1053,12 +1053,14 @@ pub struct ImplDef { impl ImplDef { pub fn all_in_crate(db: &dyn HirDatabase, krate: Crate) -> Vec { - let impls = db.impls_in_crate(krate.id); - impls.all_impls().map(Self::from).collect() + let inherent = db.inherent_impls_in_crate(krate.id); + let trait_ = db.trait_impls_in_crate(krate.id); + + inherent.all_impls().chain(trait_.all_impls()).map(Self::from).collect() } pub fn for_trait(db: &dyn HirDatabase, krate: Crate, trait_: Trait) -> Vec { - let impls = db.impls_in_crate(krate.id); - impls.lookup_impl_defs_for_trait(trait_.id).map(Self::from).collect() + let impls = db.trait_impls_in_crate(krate.id); + impls.for_trait(trait_.id).map(Self::from).collect() } pub fn target_trait(self, db: &dyn HirDatabase) -> Option { @@ -1303,10 +1305,10 @@ impl Type { mut callback: impl FnMut(AssocItem) -> Option, ) -> Option { for krate in self.ty.value.def_crates(db, krate.id)? { - let impls = db.impls_in_crate(krate); + let impls = db.inherent_impls_in_crate(krate); - for impl_def in impls.lookup_impl_defs(&self.ty.value) { - for &item in db.impl_data(impl_def).items.iter() { + for impl_def in impls.for_self_ty(&self.ty.value) { + for &item in db.impl_data(*impl_def).items.iter() { if let Some(result) = callback(item.into()) { return Some(result); } -- cgit v1.2.3