@@ -5,7 +5,7 @@ use crate::rmeta::CrateMetadata;
55
66use rustc_data_structures:: sync:: Lrc ;
77use rustc_index:: vec:: IndexVec ;
8- use rustc:: hir:: def_id:: CrateNum ;
8+ use rustc:: hir:: def_id:: { LOCAL_CRATE , CrateNum } ;
99use syntax:: ast;
1010use syntax:: edition:: Edition ;
1111use syntax:: expand:: allocator:: AllocatorKind ;
@@ -55,45 +55,40 @@ impl CStore {
5555 self . metas [ cnum] = Some ( Lrc :: new ( data) ) ;
5656 }
5757
58- crate fn iter_crate_data < I > ( & self , mut i : I )
59- where I : FnMut ( CrateNum , & CrateMetadata )
60- {
61- for ( k, v) in self . metas . iter_enumerated ( ) {
62- if let & Some ( ref v) = v {
63- i ( k, v) ;
58+ crate fn iter_crate_data ( & self , mut f : impl FnMut ( CrateNum , & CrateMetadata ) ) {
59+ for ( cnum, data) in self . metas . iter_enumerated ( ) {
60+ if let Some ( data) = data {
61+ f ( cnum, data) ;
6462 }
6563 }
6664 }
6765
68- crate fn crate_dependencies_in_rpo ( & self , krate : CrateNum ) -> Vec < CrateNum > {
69- let mut ordering = Vec :: new ( ) ;
70- self . push_dependencies_in_postorder ( & mut ordering, krate) ;
71- ordering. reverse ( ) ;
72- ordering
73- }
66+ fn push_dependencies_in_postorder ( & self , deps : & mut Vec < CrateNum > , cnum : CrateNum ) {
67+ if !deps. contains ( & cnum) {
68+ let data = self . get_crate_data ( cnum) ;
69+ for & dep in data. dependencies . borrow ( ) . iter ( ) {
70+ if dep != cnum {
71+ self . push_dependencies_in_postorder ( deps, dep) ;
72+ }
73+ }
7474
75- crate fn push_dependencies_in_postorder ( & self , ordering : & mut Vec < CrateNum > , krate : CrateNum ) {
76- if ordering. contains ( & krate) {
77- return ;
75+ deps. push ( cnum) ;
7876 }
77+ }
7978
80- let data = self . get_crate_data ( krate) ;
81- for & dep in data. dependencies . borrow ( ) . iter ( ) {
82- if dep != krate {
83- self . push_dependencies_in_postorder ( ordering, dep) ;
84- }
79+ crate fn crate_dependencies_in_postorder ( & self , cnum : CrateNum ) -> Vec < CrateNum > {
80+ let mut deps = Vec :: new ( ) ;
81+ if cnum == LOCAL_CRATE {
82+ self . iter_crate_data ( |cnum, _| self . push_dependencies_in_postorder ( & mut deps, cnum) ) ;
83+ } else {
84+ self . push_dependencies_in_postorder ( & mut deps, cnum) ;
8585 }
86-
87- ordering. push ( krate) ;
86+ deps
8887 }
8988
90- crate fn do_postorder_cnums_untracked ( & self ) -> Vec < CrateNum > {
91- let mut ordering = Vec :: new ( ) ;
92- for ( num, v) in self . metas . iter_enumerated ( ) {
93- if let & Some ( _) = v {
94- self . push_dependencies_in_postorder ( & mut ordering, num) ;
95- }
96- }
97- return ordering
89+ crate fn crate_dependencies_in_reverse_postorder ( & self , cnum : CrateNum ) -> Vec < CrateNum > {
90+ let mut deps = self . crate_dependencies_in_postorder ( cnum) ;
91+ deps. reverse ( ) ;
92+ deps
9893 }
9994}
0 commit comments