1+ use crate :: arena:: Arena ;
12use crate :: dep_graph:: { DepGraph , DepKind , DepNode , DepNodeIndex } ;
23use crate :: hir:: map:: definitions:: { self , DefPathHash } ;
34use crate :: hir:: map:: { Entry , HirEntryMap , Map } ;
5+ use crate :: hir:: { HirItem , HirOwner , HirOwnerItems } ;
46use crate :: ich:: StableHashingContext ;
57use crate :: middle:: cstore:: CrateStore ;
68use rustc_data_structures:: fingerprint:: Fingerprint ;
@@ -22,12 +24,17 @@ use std::iter::repeat;
2224
2325/// A visitor that walks over the HIR and collects `Node`s into a HIR map.
2426pub ( super ) struct NodeCollector < ' a , ' hir > {
27+ arena : & ' hir Arena < ' hir > ,
28+
2529 /// The crate
2630 krate : & ' hir Crate < ' hir > ,
2731
2832 /// Source map
2933 source_map : & ' a SourceMap ,
3034
35+ owner_map : FxHashMap < DefIndex , & ' hir HirOwner < ' hir > > ,
36+ owner_items_map : FxHashMap < DefIndex , & ' hir mut HirOwnerItems < ' hir > > ,
37+
3138 /// The node map
3239 map : HirEntryMap < ' hir > ,
3340 /// The parent of this node
@@ -112,6 +119,7 @@ fn upstream_crates(cstore: &dyn CrateStore) -> Vec<(Symbol, Fingerprint, Svh)> {
112119impl < ' a , ' hir > NodeCollector < ' a , ' hir > {
113120 pub ( super ) fn root (
114121 sess : & ' a Session ,
122+ arena : & ' hir Arena < ' hir > ,
115123 krate : & ' hir Crate < ' hir > ,
116124 dep_graph : & ' a DepGraph ,
117125 definitions : & ' a definitions:: Definitions ,
@@ -160,6 +168,7 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
160168 }
161169
162170 let mut collector = NodeCollector {
171+ arena,
163172 krate,
164173 source_map : sess. source_map ( ) ,
165174 map : IndexVec :: from_elem_n ( IndexVec :: new ( ) , definitions. def_index_count ( ) ) ,
@@ -173,6 +182,8 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
173182 hir_to_node_id,
174183 hcx,
175184 hir_body_nodes,
185+ owner_map : FxHashMap :: default ( ) ,
186+ owner_items_map : FxHashMap :: default ( ) ,
176187 } ;
177188 collector. insert_entry (
178189 hir:: CRATE_HIR_ID ,
@@ -232,9 +243,30 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
232243 }
233244
234245 fn insert_entry ( & mut self , id : HirId , entry : Entry < ' hir > ) {
246+ let i = id. local_id . as_u32 ( ) as usize ;
247+
248+ let owner = HirOwner { parent : entry. parent , node : entry. node } ;
249+
250+ let arena = self . arena ;
251+
252+ let items = self . owner_items_map . entry ( id. owner ) . or_insert_with ( || {
253+ arena. alloc ( HirOwnerItems { items : IndexVec :: new ( ) , bodies : FxHashMap :: default ( ) } )
254+ } ) ;
255+
256+ if i == 0 {
257+ assert ! ( self . owner_map. insert( id. owner, self . arena. alloc( owner) ) . is_none( ) ) ;
258+ } else {
259+ let len = items. items . len ( ) ;
260+ if i >= len {
261+ items. items . extend ( repeat ( None ) . take ( i - len + 1 ) ) ;
262+ }
263+ assert_eq ! ( entry. parent. owner, id. owner) ;
264+ items. items [ id. local_id ] =
265+ Some ( HirItem { parent : entry. parent . local_id , node : entry. node } ) ;
266+ }
267+
235268 debug ! ( "hir_map: {:?} => {:?}" , id, entry) ;
236269 let local_map = & mut self . map [ id. owner ] ;
237- let i = id. local_id . as_u32 ( ) as usize ;
238270 let len = local_map. len ( ) ;
239271 if i >= len {
240272 local_map. extend ( repeat ( None ) . take ( i - len + 1 ) ) ;
0 commit comments