diff --git a/crates/base_db/src/input.rs b/crates/base_db/src/input.rs index 43d7ccad49..e6d94f1d0d 100644 --- a/crates/base_db/src/input.rs +++ b/crates/base_db/src/input.rs @@ -334,7 +334,7 @@ impl CrateGraph { /// Returns an iterator over all transitive dependencies of the given crate, /// including the crate itself. - pub fn transitive_deps(&self, of: CrateId) -> impl Iterator + '_ { + pub fn transitive_deps(&self, of: CrateId) -> impl Iterator { let mut worklist = vec![of]; let mut deps = FxHashSet::default(); @@ -351,7 +351,7 @@ impl CrateGraph { /// Returns all transitive reverse dependencies of the given crate, /// including the crate itself. - pub fn transitive_rev_deps(&self, of: CrateId) -> impl Iterator + '_ { + pub fn transitive_rev_deps(&self, of: CrateId) -> impl Iterator { let mut worklist = vec![of]; let mut rev_deps = FxHashSet::default(); rev_deps.insert(of); diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 37bb2e1997..df17b75c05 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -175,8 +175,11 @@ impl Crate { .collect() } - pub fn transitive_reverse_dependencies(self, db: &dyn HirDatabase) -> Vec { - db.crate_graph().transitive_rev_deps(self.id).into_iter().map(|id| Crate { id }).collect() + pub fn transitive_reverse_dependencies( + self, + db: &dyn HirDatabase, + ) -> impl Iterator { + db.crate_graph().transitive_rev_deps(self.id).map(|id| Crate { id }) } pub fn root_module(self, db: &dyn HirDatabase) -> Module { diff --git a/crates/ide_db/src/search.rs b/crates/ide_db/src/search.rs index 63a45aa3ef..4a11fb73cd 100644 --- a/crates/ide_db/src/search.rs +++ b/crates/ide_db/src/search.rs @@ -102,18 +102,12 @@ impl SearchScope { /// Build a search scope spanning all the reverse dependencies of the given crate. fn reverse_dependencies(db: &RootDatabase, of: hir::Crate) -> SearchScope { let mut entries = FxHashMap::default(); - let mut insert_modules = |of: hir::Crate| { - entries.extend(of.modules(db).into_iter().filter_map(|module| { - match module.definition_source(db) { - InFile { file_id, value: ModuleSource::SourceFile(..) } => { - Some((file_id.original_file(db), None)) - } - _ => None, - } - })); - }; - insert_modules(of); - of.transitive_reverse_dependencies(db).into_iter().for_each(insert_modules); + for rev_dep in of.transitive_reverse_dependencies(db) { + let root_file = rev_dep.root_file(db); + let source_root_id = db.file_source_root(root_file); + let source_root = db.source_root(source_root_id); + entries.extend(source_root.iter().map(|id| (id, None))); + } SearchScope { entries } }