From e97cd709cd91ccfafbd45bab8b2bf01f3ddf6a04 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Mon, 15 Mar 2021 17:43:46 +0100 Subject: Implement Crate::transitive_reverse_dependencies --- crates/hir/src/lib.rs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'crates/hir') diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index c5161dadd..079a5f7b8 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -58,6 +58,7 @@ use hir_ty::{ InEnvironment, Interner, Obligation, ProjectionPredicate, ProjectionTy, Scalar, Substs, Ty, TyDefId, TyKind, TyVariableKind, }; +use itertools::Itertools; use rustc_hash::FxHashSet; use stdx::{format_to, impl_from}; use syntax::{ @@ -139,7 +140,6 @@ impl Crate { .collect() } - // FIXME: add `transitive_reverse_dependencies`. pub fn reverse_dependencies(self, db: &dyn HirDatabase) -> Vec { let crate_graph = db.crate_graph(); crate_graph @@ -151,6 +151,14 @@ impl Crate { .collect() } + pub fn transitive_reverse_dependencies(self, db: &dyn HirDatabase) -> Vec { + db.crate_graph() + .transitive_reverse_dependencies(self.id) + .into_iter() + .map(|id| Crate { id }) + .collect() + } + pub fn root_module(self, db: &dyn HirDatabase) -> Module { let def_map = db.crate_def_map(self.id); Module { id: def_map.module_id(def_map.root()) } @@ -1497,11 +1505,17 @@ impl Impl { }; let mut all = Vec::new(); - def_crates.into_iter().for_each(|id| { + def_crates.iter().for_each(|&id| { all.extend(db.inherent_impls_in_crate(id).all_impls().map(Self::from).filter(filter)) }); let fp = TyFingerprint::for_impl(&ty.value); - for id in db.crate_graph().iter() { + for id in def_crates + .iter() + .flat_map(|&id| Crate { id }.transitive_reverse_dependencies(db)) + .map(|Crate { id }| id) + .chain(def_crates.iter().copied()) + .unique() + { match fp { Some(fp) => all.extend( db.trait_impls_in_crate(id).for_self_ty(fp).map(Self::from).filter(filter), @@ -1516,7 +1530,8 @@ impl Impl { pub fn all_for_trait(db: &dyn HirDatabase, trait_: Trait) -> Vec { let krate = trait_.module(db).krate(); let mut all = Vec::new(); - for Crate { id } in krate.reverse_dependencies(db).into_iter().chain(Some(krate)) { + for Crate { id } in krate.transitive_reverse_dependencies(db).into_iter().chain(Some(krate)) + { let impls = db.trait_impls_in_crate(id); all.extend(impls.for_trait(trait_.id).map(Self::from)) } -- cgit v1.2.3