Implement Crate::transitive_reverse_dependencies

This commit is contained in:
Lukas Wirth 2021-03-15 17:43:46 +01:00
parent eec64ec01b
commit e97cd709cd
4 changed files with 71 additions and 5 deletions

View file

@ -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<Crate> {
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<Crate> {
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<Impl> {
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))
}