@@ -15,7 +15,7 @@ struct NodeCollector<'a, 'hir> {
15
15
bodies : & ' a SortedMap < ItemLocalId , & ' hir Body < ' hir > > ,
16
16
17
17
/// Outputs
18
- nodes : IndexVec < ItemLocalId , Option < ParentedNode < ' hir > > > ,
18
+ nodes : IndexVec < ItemLocalId , ParentedNode < ' hir > > ,
19
19
parenting : LocalDefIdMap < ItemLocalId > ,
20
20
21
21
/// The parent of this node
@@ -29,16 +29,19 @@ pub(super) fn index_hir<'hir>(
29
29
tcx : TyCtxt < ' hir > ,
30
30
item : hir:: OwnerNode < ' hir > ,
31
31
bodies : & SortedMap < ItemLocalId , & ' hir Body < ' hir > > ,
32
- ) -> ( IndexVec < ItemLocalId , Option < ParentedNode < ' hir > > > , LocalDefIdMap < ItemLocalId > ) {
33
- let mut nodes = IndexVec :: new ( ) ;
32
+ num_nodes : usize ,
33
+ ) -> ( IndexVec < ItemLocalId , ParentedNode < ' hir > > , LocalDefIdMap < ItemLocalId > ) {
34
+ let zero_id = ItemLocalId :: new ( 0 ) ;
35
+ let err_node = ParentedNode { parent : zero_id, node : Node :: Err ( item. span ( ) ) } ;
36
+ let mut nodes = IndexVec :: from_elem_n ( err_node, num_nodes) ;
34
37
// This node's parent should never be accessed: the owner's parent is computed by the
35
38
// hir_owner_parent query. Make it invalid (= ItemLocalId::MAX) to force an ICE whenever it is
36
39
// used.
37
- nodes. push ( Some ( ParentedNode { parent : ItemLocalId :: INVALID , node : item. into ( ) } ) ) ;
40
+ nodes[ zero_id ] = ParentedNode { parent : ItemLocalId :: INVALID , node : item. into ( ) } ;
38
41
let mut collector = NodeCollector {
39
42
tcx,
40
43
owner : item. def_id ( ) ,
41
- parent_node : ItemLocalId :: new ( 0 ) ,
44
+ parent_node : zero_id ,
42
45
nodes,
43
46
bodies,
44
47
parenting : Default :: default ( ) ,
@@ -54,6 +57,14 @@ pub(super) fn index_hir<'hir>(
54
57
OwnerNode :: ForeignItem ( item) => collector. visit_foreign_item ( item) ,
55
58
} ;
56
59
60
+ for ( local_id, node) in collector. nodes . iter_enumerated ( ) {
61
+ if let Node :: Err ( span) = node. node {
62
+ let hir_id = HirId { owner : item. def_id ( ) , local_id } ;
63
+ let msg = format ! ( "ID {hir_id} not encountered when visiting item HIR" ) ;
64
+ tcx. dcx ( ) . span_delayed_bug ( * span, msg) ;
65
+ }
66
+ }
67
+
57
68
( collector. nodes , collector. parenting )
58
69
}
59
70
@@ -88,7 +99,7 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
88
99
}
89
100
}
90
101
91
- self . nodes . insert ( hir_id. local_id , ParentedNode { parent : self . parent_node , node } ) ;
102
+ self . nodes [ hir_id. local_id ] = ParentedNode { parent : self . parent_node , node } ;
92
103
}
93
104
94
105
fn with_parent < F : FnOnce ( & mut Self ) > ( & mut self , parent_node_id : HirId , f : F ) {
@@ -348,4 +359,23 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
348
359
349
360
self . visit_nested_foreign_item ( id) ;
350
361
}
362
+
363
+ fn visit_where_predicate ( & mut self , predicate : & ' hir WherePredicate < ' hir > ) {
364
+ match predicate {
365
+ WherePredicate :: BoundPredicate ( pred) => {
366
+ self . insert ( pred. span , pred. hir_id , Node :: WhereBoundPredicate ( pred) ) ;
367
+ self . with_parent ( pred. hir_id , |this| {
368
+ intravisit:: walk_where_predicate ( this, predicate)
369
+ } )
370
+ }
371
+ _ => intravisit:: walk_where_predicate ( self , predicate) ,
372
+ }
373
+ }
374
+
375
+ fn visit_array_length ( & mut self , len : & ' hir ArrayLen ) {
376
+ match len {
377
+ ArrayLen :: Infer ( inf) => self . insert ( inf. span , inf. hir_id , Node :: ArrayLenInfer ( inf) ) ,
378
+ ArrayLen :: Body ( ..) => intravisit:: walk_array_len ( self , len) ,
379
+ }
380
+ }
351
381
}
0 commit comments