1
- use crate :: arena:: Arena ;
2
1
use crate :: hir:: map:: Map ;
3
2
use crate :: hir:: { IndexedHir , OwnerNodes , ParentedNode } ;
4
3
use rustc_data_structures:: fx:: FxHashMap ;
5
4
use rustc_hir as hir;
6
5
use rustc_hir:: def_id:: LocalDefId ;
7
- use rustc_hir:: def_id:: CRATE_DEF_ID ;
8
6
use rustc_hir:: definitions;
9
7
use rustc_hir:: intravisit:: { self , NestedVisitorMap , Visitor } ;
10
8
use rustc_hir:: * ;
@@ -17,21 +15,19 @@ use std::iter::repeat;
17
15
18
16
/// A visitor that walks over the HIR and collects `Node`s into a HIR map.
19
17
pub ( super ) struct NodeCollector < ' a , ' hir > {
20
- arena : & ' hir Arena < ' hir > ,
21
-
22
18
/// The crate
23
19
krate : & ' hir Crate < ' hir > ,
24
20
25
21
/// Source map
26
22
source_map : & ' a SourceMap ,
27
23
28
- map : IndexVec < LocalDefId , Option < & ' hir mut OwnerNodes < ' hir > > > ,
29
- parenting : FxHashMap < LocalDefId , HirId > ,
24
+ nodes : OwnerNodes < ' hir > ,
25
+ parenting : FxHashMap < LocalDefId , ItemLocalId > ,
30
26
31
27
/// The parent of this node
32
- parent_node : hir:: HirId ,
28
+ parent_node : hir:: ItemLocalId ,
33
29
34
- current_dep_node_owner : LocalDefId ,
30
+ owner : LocalDefId ,
35
31
36
32
definitions : & ' a definitions:: Definitions ,
37
33
}
@@ -46,53 +42,51 @@ fn insert_vec_map<K: Idx, V: Clone>(map: &mut IndexVec<K, Option<V>>, k: K, v: V
46
42
map[ k] = Some ( v) ;
47
43
}
48
44
49
- impl < ' a , ' hir : ' a > NodeCollector < ' a , ' hir > {
50
- pub ( super ) fn root (
51
- sess : & ' a Session ,
52
- arena : & ' hir Arena < ' hir > ,
53
- krate : & ' hir Crate < ' hir > ,
54
- definitions : & ' a definitions:: Definitions ,
55
- ) -> NodeCollector < ' a , ' hir > {
56
- let mut collector = NodeCollector {
57
- arena,
58
- krate,
59
- source_map : sess. source_map ( ) ,
60
- parent_node : hir:: CRATE_HIR_ID ,
61
- current_dep_node_owner : CRATE_DEF_ID ,
62
- definitions,
63
- map : IndexVec :: from_fn_n ( |_| None , definitions. def_index_count ( ) ) ,
64
- parenting : FxHashMap :: default ( ) ,
65
- } ;
66
- collector. insert_owner ( CRATE_DEF_ID , OwnerNode :: Crate ( krate. module ( ) ) ) ;
67
-
68
- collector
69
- }
70
-
71
- pub ( super ) fn finalize_and_compute_crate_hash ( self ) -> IndexedHir < ' hir > {
72
- IndexedHir { map : self . map , parenting : self . parenting }
73
- }
74
-
75
- fn insert_owner ( & mut self , owner : LocalDefId , node : OwnerNode < ' hir > ) {
76
- let mut nodes = IndexVec :: new ( ) ;
77
- nodes. push ( Some ( ParentedNode { parent : ItemLocalId :: new ( 0 ) , node : node. into ( ) } ) ) ;
78
-
79
- let info = self . krate . owners [ owner] . as_ref ( ) . unwrap ( ) ;
80
- let hash = info. hash ;
81
- let node_hash = info. node_hash ;
82
- let bodies = & info. bodies ;
83
-
84
- debug_assert ! ( self . map[ owner] . is_none( ) ) ;
85
- self . map [ owner] = Some ( self . arena . alloc ( OwnerNodes { hash, node_hash, nodes, bodies } ) ) ;
86
- }
45
+ pub ( super ) fn collect < ' a , ' hir : ' a > (
46
+ sess : & ' a Session ,
47
+ krate : & ' hir Crate < ' hir > ,
48
+ definitions : & ' a definitions:: Definitions ,
49
+ owner : LocalDefId ,
50
+ ) -> Option < IndexedHir < ' hir > > {
51
+ let info = krate. owners . get ( owner) ?. as_ref ( ) ?;
52
+ let item = info. node ;
53
+ let mut nodes = IndexVec :: new ( ) ;
54
+ nodes. push ( Some ( ParentedNode { parent : ItemLocalId :: new ( 0 ) , node : item. into ( ) } ) ) ;
55
+ let mut collector = NodeCollector {
56
+ krate,
57
+ source_map : sess. source_map ( ) ,
58
+ owner,
59
+ parent_node : ItemLocalId :: new ( 0 ) ,
60
+ definitions,
61
+ nodes : OwnerNodes {
62
+ hash : info. hash ,
63
+ node_hash : info. node_hash ,
64
+ nodes,
65
+ bodies : & info. bodies ,
66
+ } ,
67
+ parenting : FxHashMap :: default ( ) ,
68
+ } ;
69
+
70
+ match item {
71
+ OwnerNode :: Crate ( citem) => collector. visit_mod ( & citem, citem. inner , hir:: CRATE_HIR_ID ) ,
72
+ OwnerNode :: Item ( item) => collector. visit_item ( item) ,
73
+ OwnerNode :: TraitItem ( item) => collector. visit_trait_item ( item) ,
74
+ OwnerNode :: ImplItem ( item) => collector. visit_impl_item ( item) ,
75
+ OwnerNode :: ForeignItem ( item) => collector. visit_foreign_item ( item) ,
76
+ } ;
77
+
78
+ Some ( IndexedHir { nodes : collector. nodes , parenting : collector. parenting } )
79
+ }
87
80
81
+ impl < ' a , ' hir > NodeCollector < ' a , ' hir > {
88
82
fn insert ( & mut self , span : Span , hir_id : HirId , node : Node < ' hir > ) {
89
- debug_assert_eq ! ( self . current_dep_node_owner , hir_id. owner) ;
83
+ debug_assert_eq ! ( self . owner , hir_id. owner) ;
90
84
debug_assert_ne ! ( hir_id. local_id. as_u32( ) , 0 ) ;
91
85
92
86
// Make sure that the DepNode of some node coincides with the HirId
93
87
// owner of that node.
94
88
if cfg ! ( debug_assertions) {
95
- if hir_id. owner != self . current_dep_node_owner {
89
+ if hir_id. owner != self . owner {
96
90
let node_str = match self . definitions . opt_hir_id_to_local_def_id ( hir_id) {
97
91
Some ( def_id) => self . definitions . def_path ( def_id) . to_string_no_crate_verbose ( ) ,
98
92
None => format ! ( "{:?}" , node) ,
@@ -104,62 +98,41 @@ impl<'a, 'hir: 'a> NodeCollector<'a, 'hir> {
104
98
current_dep_node_owner={} ({:?}), hir_id.owner={} ({:?})",
105
99
self . source_map. span_to_diagnostic_string( span) ,
106
100
node_str,
107
- self . definitions
108
- . def_path( self . current_dep_node_owner)
109
- . to_string_no_crate_verbose( ) ,
110
- self . current_dep_node_owner,
101
+ self . definitions. def_path( self . owner) . to_string_no_crate_verbose( ) ,
102
+ self . owner,
111
103
self . definitions. def_path( hir_id. owner) . to_string_no_crate_verbose( ) ,
112
104
hir_id. owner,
113
105
)
114
106
}
115
107
}
116
108
117
- let nodes = self . map [ hir_id. owner ] . as_mut ( ) . unwrap ( ) ;
118
-
119
- debug_assert_eq ! ( self . parent_node. owner, self . current_dep_node_owner) ;
120
109
insert_vec_map (
121
- & mut nodes. nodes ,
110
+ & mut self . nodes . nodes ,
122
111
hir_id. local_id ,
123
- ParentedNode { parent : self . parent_node . local_id , node : node } ,
112
+ ParentedNode { parent : self . parent_node , node : node } ,
124
113
) ;
125
114
}
126
115
127
116
fn with_parent < F : FnOnce ( & mut Self ) > ( & mut self , parent_node_id : HirId , f : F ) {
117
+ debug_assert_eq ! ( parent_node_id. owner, self . owner) ;
128
118
let parent_node = self . parent_node ;
129
- self . parent_node = parent_node_id;
119
+ self . parent_node = parent_node_id. local_id ;
130
120
f ( self ) ;
131
121
self . parent_node = parent_node;
132
122
}
133
123
134
- fn with_dep_node_owner ( & mut self , dep_node_owner : LocalDefId , f : impl FnOnce ( & mut Self ) ) {
135
- let prev_owner = self . current_dep_node_owner ;
136
- let prev_parent = self . parent_node ;
137
-
138
- self . current_dep_node_owner = dep_node_owner;
139
- self . parent_node = HirId :: make_owner ( dep_node_owner) ;
140
- f ( self ) ;
141
- self . current_dep_node_owner = prev_owner;
142
- self . parent_node = prev_parent;
143
- }
144
-
145
124
fn insert_nested ( & mut self , item : LocalDefId ) {
146
- #[ cfg( debug_assertions) ]
147
- {
148
- let dk_parent = self . definitions . def_key ( item) . parent . unwrap ( ) ;
149
- let dk_parent = LocalDefId { local_def_index : dk_parent } ;
150
- let dk_parent = self . definitions . local_def_id_to_hir_id ( dk_parent) ;
151
- debug_assert_eq ! (
152
- dk_parent. owner, self . parent_node. owner,
153
- "Different parents for {:?}" ,
154
- item
155
- )
125
+ let dk_parent = self . definitions . def_key ( item) . parent . unwrap ( ) ;
126
+ let dk_parent = LocalDefId { local_def_index : dk_parent } ;
127
+ let dk_parent = self . definitions . local_def_id_to_hir_id ( dk_parent) ;
128
+ debug_assert_eq ! ( dk_parent. owner, self . owner, "Different parents for {:?}" , item) ;
129
+ if dk_parent. local_id != self . parent_node {
130
+ self . parenting . insert ( item, self . parent_node ) ;
156
131
}
157
-
158
- assert_eq ! ( self . parenting. insert( item, self . parent_node) , None ) ;
159
132
}
160
133
}
161
134
162
- impl < ' a , ' hir : ' a > Visitor < ' hir > for NodeCollector < ' a , ' hir > {
135
+ impl < ' a , ' hir > Visitor < ' hir > for NodeCollector < ' a , ' hir > {
163
136
type Map = Map < ' hir > ;
164
137
165
138
/// Because we want to track parent items and so forth, enable
@@ -173,26 +146,24 @@ impl<'a, 'hir: 'a> Visitor<'hir> for NodeCollector<'a, 'hir> {
173
146
fn visit_nested_item ( & mut self , item : ItemId ) {
174
147
debug ! ( "visit_nested_item: {:?}" , item) ;
175
148
self . insert_nested ( item. def_id ) ;
176
- self . visit_item ( self . krate . item ( item) ) ;
177
149
}
178
150
179
151
fn visit_nested_trait_item ( & mut self , item_id : TraitItemId ) {
180
152
self . insert_nested ( item_id. def_id ) ;
181
- self . visit_trait_item ( self . krate . trait_item ( item_id) ) ;
182
153
}
183
154
184
155
fn visit_nested_impl_item ( & mut self , item_id : ImplItemId ) {
185
156
self . insert_nested ( item_id. def_id ) ;
186
- self . visit_impl_item ( self . krate . impl_item ( item_id) ) ;
187
157
}
188
158
189
159
fn visit_nested_foreign_item ( & mut self , foreign_id : ForeignItemId ) {
190
160
self . insert_nested ( foreign_id. def_id ) ;
191
- self . visit_foreign_item ( self . krate . foreign_item ( foreign_id) ) ;
192
161
}
193
162
194
163
fn visit_nested_body ( & mut self , id : BodyId ) {
195
- self . visit_body ( self . krate . body ( id) ) ;
164
+ let body = self . krate . body ( id) ;
165
+ debug_assert_eq ! ( id. hir_id. owner, self . owner) ;
166
+ self . visit_body ( body) ;
196
167
}
197
168
198
169
fn visit_param ( & mut self , param : & ' hir Param < ' hir > ) {
@@ -205,8 +176,8 @@ impl<'a, 'hir: 'a> Visitor<'hir> for NodeCollector<'a, 'hir> {
205
176
206
177
fn visit_item ( & mut self , i : & ' hir Item < ' hir > ) {
207
178
debug ! ( "visit_item: {:?}" , i) ;
208
- self . insert_owner ( i. def_id , OwnerNode :: Item ( i ) ) ;
209
- self . with_dep_node_owner ( i. def_id , |this| {
179
+ debug_assert_eq ! ( i. def_id, self . owner ) ;
180
+ self . with_parent ( i. hir_id ( ) , |this| {
210
181
if let ItemKind :: Struct ( ref struct_def, _) = i. kind {
211
182
// If this is a tuple or unit-like struct, register the constructor.
212
183
if let Some ( ctor_hir_id) = struct_def. ctor_hir_id ( ) {
@@ -218,8 +189,8 @@ impl<'a, 'hir: 'a> Visitor<'hir> for NodeCollector<'a, 'hir> {
218
189
}
219
190
220
191
fn visit_foreign_item ( & mut self , fi : & ' hir ForeignItem < ' hir > ) {
221
- self . insert_owner ( fi. def_id , OwnerNode :: ForeignItem ( fi ) ) ;
222
- self . with_dep_node_owner ( fi. def_id , |this| {
192
+ debug_assert_eq ! ( fi. def_id, self . owner ) ;
193
+ self . with_parent ( fi. hir_id ( ) , |this| {
223
194
intravisit:: walk_foreign_item ( this, fi) ;
224
195
} ) ;
225
196
}
@@ -236,15 +207,15 @@ impl<'a, 'hir: 'a> Visitor<'hir> for NodeCollector<'a, 'hir> {
236
207
}
237
208
238
209
fn visit_trait_item ( & mut self , ti : & ' hir TraitItem < ' hir > ) {
239
- self . insert_owner ( ti. def_id , OwnerNode :: TraitItem ( ti ) ) ;
240
- self . with_dep_node_owner ( ti. def_id , |this| {
210
+ debug_assert_eq ! ( ti. def_id, self . owner ) ;
211
+ self . with_parent ( ti. hir_id ( ) , |this| {
241
212
intravisit:: walk_trait_item ( this, ti) ;
242
213
} ) ;
243
214
}
244
215
245
216
fn visit_impl_item ( & mut self , ii : & ' hir ImplItem < ' hir > ) {
246
- self . insert_owner ( ii. def_id , OwnerNode :: ImplItem ( ii ) ) ;
247
- self . with_dep_node_owner ( ii. def_id , |this| {
217
+ debug_assert_eq ! ( ii. def_id, self . owner ) ;
218
+ self . with_parent ( ii. hir_id ( ) , |this| {
248
219
intravisit:: walk_impl_item ( this, ii) ;
249
220
} ) ;
250
221
}
@@ -332,7 +303,8 @@ impl<'a, 'hir: 'a> Visitor<'hir> for NodeCollector<'a, 'hir> {
332
303
s : Span ,
333
304
id : HirId ,
334
305
) {
335
- assert_eq ! ( self . parent_node, id) ;
306
+ assert_eq ! ( self . owner, id. owner) ;
307
+ assert_eq ! ( self . parent_node, id. local_id) ;
336
308
intravisit:: walk_fn ( self , fk, fd, b, s, id) ;
337
309
}
338
310
0 commit comments