aboutsummaryrefslogtreecommitdiff
path: root/crates/base_db
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2021-03-23 09:49:55 +0000
committerAleksey Kladov <[email protected]>2021-03-23 09:49:55 +0000
commit45a8f37b6ae230db6c30c013f17d8aebac98a5e1 (patch)
treeddd1d23321319816f932551c0d8b0c42e590e40b /crates/base_db
parent4b997b86633b1c0ca134d89e8236d285422c04e3 (diff)
Compute more mathematically well-rounded notion of transitive deps
By including the crate itself, we make the resulting set closed with respect to `transitve_reveres_dependencies` operation, as it becomes a proper transitive closure. This just feels more proper and mathy. And, indeed, this actually allows us to simplify call sites somewhat.
Diffstat (limited to 'crates/base_db')
-rw-r--r--crates/base_db/src/input.rs4
1 files changed, 3 insertions, 1 deletions
diff --git a/crates/base_db/src/input.rs b/crates/base_db/src/input.rs
index e9e8dfc2e..248ab1de2 100644
--- a/crates/base_db/src/input.rs
+++ b/crates/base_db/src/input.rs
@@ -274,13 +274,15 @@ impl CrateGraph {
274 deps.into_iter() 274 deps.into_iter()
275 } 275 }
276 276
277 /// Returns an iterator over all transitive reverse dependencies of the given crate. 277 /// Returns all transitive reverse dependencies of the given crate,
278 /// including the crate itself.
278 pub fn transitive_reverse_dependencies( 279 pub fn transitive_reverse_dependencies(
279 &self, 280 &self,
280 of: CrateId, 281 of: CrateId,
281 ) -> impl Iterator<Item = CrateId> + '_ { 282 ) -> impl Iterator<Item = CrateId> + '_ {
282 let mut worklist = vec![of]; 283 let mut worklist = vec![of];
283 let mut rev_deps = FxHashSet::default(); 284 let mut rev_deps = FxHashSet::default();
285 rev_deps.insert(of);
284 let mut inverted_graph = FxHashMap::<_, Vec<_>>::default(); 286 let mut inverted_graph = FxHashMap::<_, Vec<_>>::default();
285 self.arena.iter().for_each(|(&krate, data)| { 287 self.arena.iter().for_each(|(&krate, data)| {
286 data.dependencies 288 data.dependencies