@@ -15,7 +15,7 @@ struct NodeCollector<'a, 'hir> {
1515 bodies : & ' a SortedMap < ItemLocalId , & ' hir Body < ' hir > > ,
1616
1717 /// Outputs
18- nodes : IndexVec < ItemLocalId , Option < ParentedNode < ' hir > > > ,
18+ nodes : IndexVec < ItemLocalId , ParentedNode < ' hir > > ,
1919 parenting : LocalDefIdMap < ItemLocalId > ,
2020
2121 /// The parent of this node
@@ -29,16 +29,19 @@ pub(super) fn index_hir<'hir>(
2929 tcx : TyCtxt < ' hir > ,
3030 item : hir:: OwnerNode < ' hir > ,
3131 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) ;
3437 // This node's parent should never be accessed: the owner's parent is computed by the
3538 // hir_owner_parent query. Make it invalid (= ItemLocalId::MAX) to force an ICE whenever it is
3639 // used.
37- nodes. push ( Some ( ParentedNode { parent : ItemLocalId :: INVALID , node : item. into ( ) } ) ) ;
40+ nodes[ zero_id ] = ParentedNode { parent : ItemLocalId :: INVALID , node : item. into ( ) } ;
3841 let mut collector = NodeCollector {
3942 tcx,
4043 owner : item. def_id ( ) ,
41- parent_node : ItemLocalId :: new ( 0 ) ,
44+ parent_node : zero_id ,
4245 nodes,
4346 bodies,
4447 parenting : Default :: default ( ) ,
@@ -54,6 +57,14 @@ pub(super) fn index_hir<'hir>(
5457 OwnerNode :: ForeignItem ( item) => collector. visit_foreign_item ( item) ,
5558 } ;
5659
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+
5768 ( collector. nodes , collector. parenting )
5869}
5970
@@ -88,7 +99,7 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
8899 }
89100 }
90101
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 } ;
92103 }
93104
94105 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> {
348359
349360 self . visit_nested_foreign_item ( id) ;
350361 }
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+ }
351381}
0 commit comments