1
1
use crate :: arena:: Arena ;
2
2
use crate :: hir:: map:: definitions:: { self , DefPathHash } ;
3
- use crate :: hir:: map:: { Entry , Map } ;
3
+ use crate :: hir:: map:: { Entry , HirOwnerData , Map } ;
4
4
use crate :: hir:: { HirItem , HirOwner , HirOwnerItems } ;
5
5
use crate :: ich:: StableHashingContext ;
6
6
use crate :: middle:: cstore:: CrateStore ;
@@ -14,7 +14,7 @@ use rustc_hir::def_id::CRATE_DEF_INDEX;
14
14
use rustc_hir:: def_id:: { CrateNum , DefIndex , LOCAL_CRATE } ;
15
15
use rustc_hir:: intravisit:: { self , NestedVisitorMap , Visitor } ;
16
16
use rustc_hir:: * ;
17
- use rustc_index:: vec:: IndexVec ;
17
+ use rustc_index:: vec:: { Idx , IndexVec } ;
18
18
use rustc_session:: { CrateDisambiguator , Session } ;
19
19
use rustc_span:: source_map:: SourceMap ;
20
20
use rustc_span:: { Span , Symbol , DUMMY_SP } ;
@@ -31,8 +31,7 @@ pub(super) struct NodeCollector<'a, 'hir> {
31
31
/// Source map
32
32
source_map : & ' a SourceMap ,
33
33
34
- owner_map : FxHashMap < DefIndex , & ' hir HirOwner < ' hir > > ,
35
- owner_items_map : FxHashMap < DefIndex , & ' hir mut HirOwnerItems < ' hir > > ,
34
+ map : IndexVec < DefIndex , HirOwnerData < ' hir > > ,
36
35
37
36
/// The parent of this node
38
37
parent_node : hir:: HirId ,
@@ -49,6 +48,15 @@ pub(super) struct NodeCollector<'a, 'hir> {
49
48
hir_body_nodes : Vec < ( DefPathHash , Fingerprint ) > ,
50
49
}
51
50
51
+ fn insert_vec_map < K : Idx , V : Clone > ( map : & mut IndexVec < K , Option < V > > , k : K , v : V ) {
52
+ let i = k. index ( ) ;
53
+ let len = map. len ( ) ;
54
+ if i >= len {
55
+ map. extend ( repeat ( None ) . take ( i - len + 1 ) ) ;
56
+ }
57
+ map[ k] = Some ( v) ;
58
+ }
59
+
52
60
fn hash (
53
61
hcx : & mut StableHashingContext < ' _ > ,
54
62
input : impl for < ' a > HashStable < StableHashingContext < ' a > > ,
@@ -126,14 +134,9 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
126
134
hir_to_node_id,
127
135
hcx,
128
136
hir_body_nodes,
129
- owner_map : FxHashMap :: with_capacity_and_hasher (
130
- definitions. def_index_count ( ) ,
131
- Default :: default ( ) ,
132
- ) ,
133
- owner_items_map : FxHashMap :: with_capacity_and_hasher (
134
- definitions. def_index_count ( ) ,
135
- Default :: default ( ) ,
136
- ) ,
137
+ map : ( 0 ..definitions. def_index_count ( ) )
138
+ . map ( |_| HirOwnerData { signature : None , with_bodies : None } )
139
+ . collect ( ) ,
137
140
} ;
138
141
collector. insert_entry (
139
142
hir:: CRATE_HIR_ID ,
@@ -149,14 +152,10 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
149
152
crate_disambiguator : CrateDisambiguator ,
150
153
cstore : & dyn CrateStore ,
151
154
commandline_args_hash : u64 ,
152
- ) -> (
153
- FxHashMap < DefIndex , & ' hir HirOwner < ' hir > > ,
154
- FxHashMap < DefIndex , & ' hir mut HirOwnerItems < ' hir > > ,
155
- Svh ,
156
- ) {
155
+ ) -> ( IndexVec < DefIndex , HirOwnerData < ' hir > > , Svh ) {
157
156
// Insert bodies into the map
158
157
for ( id, body) in self . krate . bodies . iter ( ) {
159
- let bodies = & mut self . owner_items_map . get_mut ( & id. hir_id . owner ) . unwrap ( ) . bodies ;
158
+ let bodies = & mut self . map [ id. hir_id . owner ] . with_bodies . as_mut ( ) . unwrap ( ) . bodies ;
160
159
assert ! ( bodies. insert( id. hir_id. local_id, body) . is_none( ) ) ;
161
160
}
162
161
@@ -196,39 +195,42 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
196
195
let crate_hash: Fingerprint = stable_hasher. finish ( ) ;
197
196
198
197
let svh = Svh :: new ( crate_hash. to_smaller_hash ( ) ) ;
199
- ( self . owner_map , self . owner_items_map , svh)
198
+ ( self . map , svh)
200
199
}
201
200
202
201
fn insert_entry ( & mut self , id : HirId , entry : Entry < ' hir > , hash : Fingerprint ) {
203
202
let i = id. local_id . as_u32 ( ) as usize ;
204
203
205
- let owner = HirOwner { parent : entry. parent , node : entry. node } ;
206
-
207
204
let arena = self . arena ;
208
205
209
- let items = self . owner_items_map . entry ( id. owner ) . or_insert_with ( || {
210
- arena. alloc ( HirOwnerItems {
206
+ let data = & mut self . map [ id. owner ] ;
207
+
208
+ if data. with_bodies . is_none ( ) {
209
+ data. with_bodies = Some ( arena. alloc ( HirOwnerItems {
211
210
hash,
212
211
items : IndexVec :: new ( ) ,
213
212
bodies : FxHashMap :: default ( ) ,
214
- } )
215
- } ) ;
213
+ } ) ) ;
214
+ }
215
+
216
+ let items = data. with_bodies . as_mut ( ) . unwrap ( ) ;
216
217
217
218
if i == 0 {
218
219
// Overwrite the dummy hash with the real HIR owner hash.
219
220
items. hash = hash;
220
221
221
- self . owner_map . insert ( id. owner , self . arena . alloc ( owner) ) ;
222
- // FIXME: feature(impl_trait_in_bindings) broken and trigger this assert
223
- //assert!(self.owner_map.insert(id.owner, self.arena.alloc(owner)).is_none());
222
+ // FIXME: feature(impl_trait_in_bindings) broken and trigger this assert
223
+ //assert!(data.signature.is_none());
224
+
225
+ data. signature =
226
+ Some ( self . arena . alloc ( HirOwner { parent : entry. parent , node : entry. node } ) ) ;
224
227
} else {
225
- let len = items. items . len ( ) ;
226
- if i >= len {
227
- items. items . extend ( repeat ( None ) . take ( i - len + 1 ) ) ;
228
- }
229
228
assert_eq ! ( entry. parent. owner, id. owner) ;
230
- items. items [ id. local_id ] =
231
- Some ( HirItem { parent : entry. parent . local_id , node : entry. node } ) ;
229
+ insert_vec_map (
230
+ & mut items. items ,
231
+ id. local_id ,
232
+ HirItem { parent : entry. parent . local_id , node : entry. node } ,
233
+ ) ;
232
234
}
233
235
}
234
236
0 commit comments