@@ -482,6 +482,37 @@ impl Crate {
482482 }
483483 deps. into_boxed_slice ( )
484484 }
485+
486+ /// Returns all transitive reverse dependencies of the given crate,
487+ /// including the crate itself.
488+ ///
489+ /// **Warning**: do not use this query in `hir-*` crates! It kills incrementality across crate metadata modifications.
490+ pub fn transitive_rev_deps ( self , db : & dyn RootQueryDb ) -> Box < [ Crate ] > {
491+ let mut worklist = vec ! [ self ] ;
492+ let mut rev_deps = FxHashSet :: default ( ) ;
493+ rev_deps. insert ( self ) ;
494+
495+ let mut inverted_graph = FxHashMap :: < _ , Vec < _ > > :: default ( ) ;
496+ db. all_crates ( ) . iter ( ) . for_each ( |& krate| {
497+ krate
498+ . data ( db)
499+ . dependencies
500+ . iter ( )
501+ . for_each ( |dep| inverted_graph. entry ( dep. crate_id ) . or_default ( ) . push ( krate) )
502+ } ) ;
503+
504+ while let Some ( krate) = worklist. pop ( ) {
505+ if let Some ( crate_rev_deps) = inverted_graph. get ( & krate) {
506+ crate_rev_deps
507+ . iter ( )
508+ . copied ( )
509+ . filter ( |& rev_dep| rev_deps. insert ( rev_dep) )
510+ . for_each ( |rev_dep| worklist. push ( rev_dep) ) ;
511+ }
512+ }
513+
514+ rev_deps. into_iter ( ) . collect :: < Box < _ > > ( )
515+ }
485516}
486517
487518/// The mapping from [`UniqueCrateData`] to their [`Crate`] input.
@@ -826,33 +857,6 @@ impl CrateGraphBuilder {
826857 }
827858}
828859
829- pub ( crate ) fn transitive_rev_deps ( db : & dyn RootQueryDb , of : Crate ) -> FxHashSet < Crate > {
830- let mut worklist = vec ! [ of] ;
831- let mut rev_deps = FxHashSet :: default ( ) ;
832- rev_deps. insert ( of) ;
833-
834- let mut inverted_graph = FxHashMap :: < _ , Vec < _ > > :: default ( ) ;
835- db. all_crates ( ) . iter ( ) . for_each ( |& krate| {
836- krate
837- . data ( db)
838- . dependencies
839- . iter ( )
840- . for_each ( |dep| inverted_graph. entry ( dep. crate_id ) . or_default ( ) . push ( krate) )
841- } ) ;
842-
843- while let Some ( krate) = worklist. pop ( ) {
844- if let Some ( crate_rev_deps) = inverted_graph. get ( & krate) {
845- crate_rev_deps
846- . iter ( )
847- . copied ( )
848- . filter ( |& rev_dep| rev_deps. insert ( rev_dep) )
849- . for_each ( |rev_dep| worklist. push ( rev_dep) ) ;
850- }
851- }
852-
853- rev_deps
854- }
855-
856860impl BuiltCrateData {
857861 pub fn root_file_id ( & self , db : & dyn salsa:: Database ) -> EditionedFileId {
858862 EditionedFileId :: new ( db, self . root_file_id , self . edition )
0 commit comments