@@ -5,7 +5,7 @@ use crate::rmeta::CrateMetadata;
5
5
6
6
use rustc_data_structures:: sync:: Lrc ;
7
7
use rustc_index:: vec:: IndexVec ;
8
- use rustc:: hir:: def_id:: CrateNum ;
8
+ use rustc:: hir:: def_id:: { LOCAL_CRATE , CrateNum } ;
9
9
use syntax:: ast;
10
10
use syntax:: edition:: Edition ;
11
11
use syntax:: expand:: allocator:: AllocatorKind ;
@@ -55,45 +55,40 @@ impl CStore {
55
55
self . metas [ cnum] = Some ( Lrc :: new ( data) ) ;
56
56
}
57
57
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) ;
64
62
}
65
63
}
66
64
}
67
65
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
+ }
74
74
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) ;
78
76
}
77
+ }
79
78
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) ;
85
85
}
86
-
87
- ordering. push ( krate) ;
86
+ deps
88
87
}
89
88
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
98
93
}
99
94
}
0 commit comments