@@ -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 ) {
@@ -254,6 +265,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
254265 }
255266
256267 fn visit_path_segment ( & mut self , path_segment : & ' hir PathSegment < ' hir > ) {
268+ // FIXME: walk path segment with `path_segment.hir_id` parent.
257269 self . insert ( path_segment. ident . span , path_segment. hir_id , Node :: PathSegment ( path_segment) ) ;
258270 intravisit:: walk_path_segment ( self , path_segment) ;
259271 }
@@ -348,4 +360,23 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
348360
349361 self . visit_nested_foreign_item ( id) ;
350362 }
363+
364+ fn visit_where_predicate ( & mut self , predicate : & ' hir WherePredicate < ' hir > ) {
365+ match predicate {
366+ WherePredicate :: BoundPredicate ( pred) => {
367+ self . insert ( pred. span , pred. hir_id , Node :: WhereBoundPredicate ( pred) ) ;
368+ self . with_parent ( pred. hir_id , |this| {
369+ intravisit:: walk_where_predicate ( this, predicate)
370+ } )
371+ }
372+ _ => intravisit:: walk_where_predicate ( self , predicate) ,
373+ }
374+ }
375+
376+ fn visit_array_length ( & mut self , len : & ' hir ArrayLen ) {
377+ match len {
378+ ArrayLen :: Infer ( inf) => self . insert ( inf. span , inf. hir_id , Node :: ArrayLenInfer ( inf) ) ,
379+ ArrayLen :: Body ( ..) => intravisit:: walk_array_len ( self , len) ,
380+ }
381+ }
351382}
0 commit comments