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.
This commit is contained in:
parent
4b997b8663
commit
45a8f37b6a
@ -274,13 +274,15 @@ pub fn transitive_deps(&self, of: CrateId) -> impl Iterator<Item = CrateId> + '_
|
||||
deps.into_iter()
|
||||
}
|
||||
|
||||
/// Returns an iterator over all transitive reverse dependencies of the given crate.
|
||||
/// Returns all transitive reverse dependencies of the given crate,
|
||||
/// including the crate itself.
|
||||
pub fn transitive_reverse_dependencies(
|
||||
&self,
|
||||
of: CrateId,
|
||||
) -> impl Iterator<Item = CrateId> + '_ {
|
||||
let mut worklist = vec![of];
|
||||
let mut rev_deps = FxHashSet::default();
|
||||
rev_deps.insert(of);
|
||||
let mut inverted_graph = FxHashMap::<_, Vec<_>>::default();
|
||||
self.arena.iter().for_each(|(&krate, data)| {
|
||||
data.dependencies
|
||||
|
@ -1572,8 +1572,7 @@ pub fn all_for_type(db: &dyn HirDatabase, Type { krate, ty, .. }: Type) -> Vec<I
|
||||
pub fn all_for_trait(db: &dyn HirDatabase, trait_: Trait) -> Vec<Impl> {
|
||||
let krate = trait_.module(db).krate();
|
||||
let mut all = Vec::new();
|
||||
for Crate { id } in krate.transitive_reverse_dependencies(db).into_iter().chain(Some(krate))
|
||||
{
|
||||
for Crate { id } in krate.transitive_reverse_dependencies(db).into_iter() {
|
||||
let impls = db.trait_impls_in_crate(id);
|
||||
all.extend(impls.for_trait(trait_.id).map(Self::from))
|
||||
}
|
||||
|
@ -245,9 +245,7 @@ fn search_scope(&self, db: &RootDatabase) -> SearchScope {
|
||||
}
|
||||
|
||||
if let Some(Visibility::Public) = vis {
|
||||
let source_root_id = db.file_source_root(file_id);
|
||||
let source_root = db.source_root(source_root_id);
|
||||
let mut res = source_root.iter().map(|id| (id, None)).collect::<FxHashMap<_, _>>();
|
||||
let mut res = FxHashMap::default();
|
||||
|
||||
let krate = module.krate();
|
||||
for rev_dep in krate.transitive_reverse_dependencies(db) {
|
||||
|
Loading…
Reference in New Issue
Block a user