mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
Merge #8162
8162: Compute more mathematically well-rounded notion of transitive deps r=Veykril a=matklad 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. Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
commit
1efd220f2f
@ -257,7 +257,8 @@ impl CrateGraph {
|
|||||||
self.arena.keys().copied()
|
self.arena.keys().copied()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns an iterator over all transitive dependencies of the given crate.
|
/// Returns an iterator over all transitive dependencies of the given crate,
|
||||||
|
/// including the crate itself.
|
||||||
pub fn transitive_deps(&self, of: CrateId) -> impl Iterator<Item = CrateId> + '_ {
|
pub fn transitive_deps(&self, of: CrateId) -> impl Iterator<Item = CrateId> + '_ {
|
||||||
let mut worklist = vec![of];
|
let mut worklist = vec![of];
|
||||||
let mut deps = FxHashSet::default();
|
let mut deps = FxHashSet::default();
|
||||||
@ -270,17 +271,16 @@ impl CrateGraph {
|
|||||||
worklist.extend(self[krate].dependencies.iter().map(|dep| dep.crate_id));
|
worklist.extend(self[krate].dependencies.iter().map(|dep| dep.crate_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
deps.remove(&of);
|
|
||||||
deps.into_iter()
|
deps.into_iter()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns an iterator over all transitive reverse dependencies of the given crate.
|
/// Returns all transitive reverse dependencies of the given crate,
|
||||||
pub fn transitive_reverse_dependencies(
|
/// including the crate itself.
|
||||||
&self,
|
pub fn transitive_rev_deps(&self, of: CrateId) -> impl Iterator<Item = CrateId> + '_ {
|
||||||
of: CrateId,
|
|
||||||
) -> impl Iterator<Item = CrateId> + '_ {
|
|
||||||
let mut worklist = vec![of];
|
let mut worklist = vec![of];
|
||||||
let mut rev_deps = FxHashSet::default();
|
let mut rev_deps = FxHashSet::default();
|
||||||
|
rev_deps.insert(of);
|
||||||
|
|
||||||
let mut inverted_graph = FxHashMap::<_, Vec<_>>::default();
|
let mut inverted_graph = FxHashMap::<_, Vec<_>>::default();
|
||||||
self.arena.iter().for_each(|(&krate, data)| {
|
self.arena.iter().for_each(|(&krate, data)| {
|
||||||
data.dependencies
|
data.dependencies
|
||||||
|
@ -154,11 +154,7 @@ impl Crate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn transitive_reverse_dependencies(self, db: &dyn HirDatabase) -> Vec<Crate> {
|
pub fn transitive_reverse_dependencies(self, db: &dyn HirDatabase) -> Vec<Crate> {
|
||||||
db.crate_graph()
|
db.crate_graph().transitive_rev_deps(self.id).into_iter().map(|id| Crate { id }).collect()
|
||||||
.transitive_reverse_dependencies(self.id)
|
|
||||||
.into_iter()
|
|
||||||
.map(|id| Crate { id })
|
|
||||||
.collect()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn root_module(self, db: &dyn HirDatabase) -> Module {
|
pub fn root_module(self, db: &dyn HirDatabase) -> Module {
|
||||||
@ -1572,8 +1568,7 @@ impl Impl {
|
|||||||
pub fn all_for_trait(db: &dyn HirDatabase, trait_: Trait) -> Vec<Impl> {
|
pub fn all_for_trait(db: &dyn HirDatabase, trait_: Trait) -> Vec<Impl> {
|
||||||
let krate = trait_.module(db).krate();
|
let krate = trait_.module(db).krate();
|
||||||
let mut all = Vec::new();
|
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);
|
let impls = db.trait_impls_in_crate(id);
|
||||||
all.extend(impls.for_trait(trait_.id).map(Self::from))
|
all.extend(impls.for_trait(trait_.id).map(Self::from))
|
||||||
}
|
}
|
||||||
|
@ -245,9 +245,7 @@ impl Definition {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(Visibility::Public) = vis {
|
if let Some(Visibility::Public) = vis {
|
||||||
let source_root_id = db.file_source_root(file_id);
|
let mut res = FxHashMap::default();
|
||||||
let source_root = db.source_root(source_root_id);
|
|
||||||
let mut res = source_root.iter().map(|id| (id, None)).collect::<FxHashMap<_, _>>();
|
|
||||||
|
|
||||||
let krate = module.krate();
|
let krate = module.krate();
|
||||||
for rev_dep in krate.transitive_reverse_dependencies(db) {
|
for rev_dep in krate.transitive_reverse_dependencies(db) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user