@@ -130,19 +130,19 @@ enum MapEntry<'ast> {
130
130
NotPresent ,
131
131
132
132
/// All the node types, with a parent and scope ID.
133
- EntryItem ( NodeId , NodeId , & ' ast Item ) ,
134
- EntryForeignItem ( NodeId , NodeId , & ' ast ForeignItem ) ,
135
- EntryTraitItem ( NodeId , NodeId , & ' ast TraitItem ) ,
136
- EntryImplItem ( NodeId , NodeId , & ' ast ImplItem ) ,
137
- EntryVariant ( NodeId , NodeId , & ' ast Variant ) ,
138
- EntryExpr ( NodeId , NodeId , & ' ast Expr ) ,
139
- EntryStmt ( NodeId , NodeId , & ' ast Stmt ) ,
140
- EntryArg ( NodeId , NodeId , & ' ast Pat ) ,
141
- EntryLocal ( NodeId , NodeId , & ' ast Pat ) ,
142
- EntryPat ( NodeId , NodeId , & ' ast Pat ) ,
143
- EntryBlock ( NodeId , NodeId , & ' ast Block ) ,
144
- EntryStructCtor ( NodeId , NodeId , & ' ast StructDef ) ,
145
- EntryLifetime ( NodeId , NodeId , & ' ast Lifetime ) ,
133
+ EntryItem ( NodeId , & ' ast Item ) ,
134
+ EntryForeignItem ( NodeId , & ' ast ForeignItem ) ,
135
+ EntryTraitItem ( NodeId , & ' ast TraitItem ) ,
136
+ EntryImplItem ( NodeId , & ' ast ImplItem ) ,
137
+ EntryVariant ( NodeId , & ' ast Variant ) ,
138
+ EntryExpr ( NodeId , & ' ast Expr ) ,
139
+ EntryStmt ( NodeId , & ' ast Stmt ) ,
140
+ EntryArg ( NodeId , & ' ast Pat ) ,
141
+ EntryLocal ( NodeId , & ' ast Pat ) ,
142
+ EntryPat ( NodeId , & ' ast Pat ) ,
143
+ EntryBlock ( NodeId , & ' ast Block ) ,
144
+ EntryStructCtor ( NodeId , & ' ast StructDef ) ,
145
+ EntryLifetime ( NodeId , & ' ast Lifetime ) ,
146
146
147
147
/// Roots for node trees.
148
148
RootCrate ,
@@ -162,77 +162,58 @@ struct InlinedParent {
162
162
}
163
163
164
164
impl < ' ast > MapEntry < ' ast > {
165
- fn from_node ( p : NodeId , s : NodeId , node : Node < ' ast > ) -> MapEntry < ' ast > {
165
+ fn from_node ( s : NodeId , node : Node < ' ast > ) -> MapEntry < ' ast > {
166
166
match node {
167
- NodeItem ( n) => EntryItem ( p , s, n) ,
168
- NodeForeignItem ( n) => EntryForeignItem ( p , s, n) ,
169
- NodeTraitItem ( n) => EntryTraitItem ( p , s, n) ,
170
- NodeImplItem ( n) => EntryImplItem ( p , s, n) ,
171
- NodeVariant ( n) => EntryVariant ( p , s, n) ,
172
- NodeExpr ( n) => EntryExpr ( p , s, n) ,
173
- NodeStmt ( n) => EntryStmt ( p , s, n) ,
174
- NodeArg ( n) => EntryArg ( p , s, n) ,
175
- NodeLocal ( n) => EntryLocal ( p , s, n) ,
176
- NodePat ( n) => EntryPat ( p , s, n) ,
177
- NodeBlock ( n) => EntryBlock ( p , s, n) ,
178
- NodeStructCtor ( n) => EntryStructCtor ( p , s, n) ,
179
- NodeLifetime ( n) => EntryLifetime ( p , s, n)
167
+ NodeItem ( n) => EntryItem ( s, n) ,
168
+ NodeForeignItem ( n) => EntryForeignItem ( s, n) ,
169
+ NodeTraitItem ( n) => EntryTraitItem ( s, n) ,
170
+ NodeImplItem ( n) => EntryImplItem ( s, n) ,
171
+ NodeVariant ( n) => EntryVariant ( s, n) ,
172
+ NodeExpr ( n) => EntryExpr ( s, n) ,
173
+ NodeStmt ( n) => EntryStmt ( s, n) ,
174
+ NodeArg ( n) => EntryArg ( s, n) ,
175
+ NodeLocal ( n) => EntryLocal ( s, n) ,
176
+ NodePat ( n) => EntryPat ( s, n) ,
177
+ NodeBlock ( n) => EntryBlock ( s, n) ,
178
+ NodeStructCtor ( n) => EntryStructCtor ( s, n) ,
179
+ NodeLifetime ( n) => EntryLifetime ( s, n)
180
180
}
181
181
}
182
182
183
- fn parent ( self ) -> Option < NodeId > {
184
- Some ( match self {
185
- EntryItem ( id, _, _) => id,
186
- EntryForeignItem ( id, _, _) => id,
187
- EntryTraitItem ( id, _, _) => id,
188
- EntryImplItem ( id, _, _) => id,
189
- EntryVariant ( id, _, _) => id,
190
- EntryExpr ( id, _, _) => id,
191
- EntryStmt ( id, _, _) => id,
192
- EntryArg ( id, _, _) => id,
193
- EntryLocal ( id, _, _) => id,
194
- EntryPat ( id, _, _) => id,
195
- EntryBlock ( id, _, _) => id,
196
- EntryStructCtor ( id, _, _) => id,
197
- EntryLifetime ( id, _, _) => id,
198
- _ => return None
199
- } )
200
- }
201
-
202
183
fn parent_node ( self ) -> Option < NodeId > {
203
184
Some ( match self {
204
- EntryItem ( _ , id, _) => id,
205
- EntryForeignItem ( _ , id, _) => id,
206
- EntryTraitItem ( _ , id, _) => id,
207
- EntryImplItem ( _ , id, _) => id,
208
- EntryVariant ( _ , id, _) => id,
209
- EntryExpr ( _ , id, _) => id,
210
- EntryStmt ( _ , id, _) => id,
211
- EntryArg ( _ , id, _) => id,
212
- EntryLocal ( _ , id, _) => id,
213
- EntryPat ( _ , id, _) => id,
214
- EntryBlock ( _ , id, _) => id,
215
- EntryStructCtor ( _ , id, _) => id,
216
- EntryLifetime ( _ , id, _) => id,
185
+ EntryItem ( id, _) => id,
186
+ EntryForeignItem ( id, _) => id,
187
+ EntryTraitItem ( id, _) => id,
188
+ EntryImplItem ( id, _) => id,
189
+ EntryVariant ( id, _) => id,
190
+ EntryExpr ( id, _) => id,
191
+ EntryStmt ( id, _) => id,
192
+ EntryArg ( id, _) => id,
193
+ EntryLocal ( id, _) => id,
194
+ EntryPat ( id, _) => id,
195
+ EntryBlock ( id, _) => id,
196
+ EntryStructCtor ( id, _) => id,
197
+ EntryLifetime ( id, _) => id,
217
198
_ => return None
218
199
} )
219
200
}
220
201
221
202
fn to_node ( self ) -> Option < Node < ' ast > > {
222
203
Some ( match self {
223
- EntryItem ( _, _ , n) => NodeItem ( n) ,
224
- EntryForeignItem ( _, _ , n) => NodeForeignItem ( n) ,
225
- EntryTraitItem ( _, _ , n) => NodeTraitItem ( n) ,
226
- EntryImplItem ( _, _ , n) => NodeImplItem ( n) ,
227
- EntryVariant ( _, _ , n) => NodeVariant ( n) ,
228
- EntryExpr ( _, _ , n) => NodeExpr ( n) ,
229
- EntryStmt ( _, _ , n) => NodeStmt ( n) ,
230
- EntryArg ( _, _ , n) => NodeArg ( n) ,
231
- EntryLocal ( _, _ , n) => NodeLocal ( n) ,
232
- EntryPat ( _, _ , n) => NodePat ( n) ,
233
- EntryBlock ( _, _ , n) => NodeBlock ( n) ,
234
- EntryStructCtor ( _, _ , n) => NodeStructCtor ( n) ,
235
- EntryLifetime ( _, _ , n) => NodeLifetime ( n) ,
204
+ EntryItem ( _, n) => NodeItem ( n) ,
205
+ EntryForeignItem ( _, n) => NodeForeignItem ( n) ,
206
+ EntryTraitItem ( _, n) => NodeTraitItem ( n) ,
207
+ EntryImplItem ( _, n) => NodeImplItem ( n) ,
208
+ EntryVariant ( _, n) => NodeVariant ( n) ,
209
+ EntryExpr ( _, n) => NodeExpr ( n) ,
210
+ EntryStmt ( _, n) => NodeStmt ( n) ,
211
+ EntryArg ( _, n) => NodeArg ( n) ,
212
+ EntryLocal ( _, n) => NodeLocal ( n) ,
213
+ EntryPat ( _, n) => NodePat ( n) ,
214
+ EntryBlock ( _, n) => NodeBlock ( n) ,
215
+ EntryStructCtor ( _, n) => NodeStructCtor ( n) ,
216
+ EntryLifetime ( _, n) => NodeLifetime ( n) ,
236
217
_ => return None
237
218
} )
238
219
}
@@ -306,7 +287,37 @@ impl<'ast> Map<'ast> {
306
287
/// Retrieve the parent NodeId for `id`, or `id` itself if no
307
288
/// parent is registered in this map.
308
289
pub fn get_parent ( & self , id : NodeId ) -> NodeId {
309
- self . find_entry ( id) . and_then ( |x| x. parent ( ) ) . unwrap_or ( id)
290
+ let mut id = id;
291
+ loop {
292
+ let parent_node = self . get_parent_node ( id) ;
293
+ if parent_node == 0 {
294
+ return parent_node;
295
+ }
296
+ if parent_node == id {
297
+ return id;
298
+ }
299
+
300
+ let node = self . find_entry ( parent_node) ;
301
+ if node. is_none ( ) {
302
+ return id;
303
+ }
304
+ let node = node. unwrap ( ) . to_node ( ) ;
305
+ match node {
306
+ Some ( node) => match node {
307
+ NodeItem ( _) |
308
+ NodeForeignItem ( _) |
309
+ NodeTraitItem ( _) |
310
+ NodeImplItem ( _) => {
311
+ return parent_node;
312
+ }
313
+ _ => { }
314
+ } ,
315
+ None => {
316
+ return parent_node;
317
+ }
318
+ }
319
+ id = parent_node;
320
+ }
310
321
}
311
322
312
323
/// Similar to get_parent, returns the parent node id or id if there is no
@@ -334,6 +345,10 @@ impl<'ast> Map<'ast> {
334
345
return None ;
335
346
}
336
347
348
+ if cur_id == 0 {
349
+ return Some ( 0 ) ;
350
+ }
351
+
337
352
match self . get ( cur_id) {
338
353
NodeItem ( _) |
339
354
NodeForeignItem ( _) |
@@ -361,7 +376,7 @@ impl<'ast> Map<'ast> {
361
376
pub fn get_foreign_abi ( & self , id : NodeId ) -> abi:: Abi {
362
377
let parent = self . get_parent ( id) ;
363
378
let abi = match self . find_entry ( parent) {
364
- Some ( EntryItem ( _, _ , i) ) => {
379
+ Some ( EntryItem ( _, i) ) => {
365
380
match i. node {
366
381
ItemForeignMod ( ref nm) => Some ( nm. abi ) ,
367
382
_ => None
@@ -650,15 +665,15 @@ impl<'a, 'ast> Iterator for NodesMatchingSuffix<'a, 'ast> {
650
665
return None ;
651
666
}
652
667
self . idx += 1 ;
653
- let ( p , name) = match self . map . find_entry ( idx) {
654
- Some ( EntryItem ( p , _, n) ) => ( p , n. name ( ) ) ,
655
- Some ( EntryForeignItem ( p , _, n) ) => ( p , n. name ( ) ) ,
656
- Some ( EntryTraitItem ( p , _, n) ) => ( p , n. name ( ) ) ,
657
- Some ( EntryImplItem ( p , _, n) ) => ( p , n. name ( ) ) ,
658
- Some ( EntryVariant ( p , _, n) ) => ( p , n. name ( ) ) ,
668
+ let name = match self . map . find_entry ( idx) {
669
+ Some ( EntryItem ( _, n) ) => n. name ( ) ,
670
+ Some ( EntryForeignItem ( _, n) ) => n. name ( ) ,
671
+ Some ( EntryTraitItem ( _, n) ) => n. name ( ) ,
672
+ Some ( EntryImplItem ( _, n) ) => n. name ( ) ,
673
+ Some ( EntryVariant ( _, n) ) => n. name ( ) ,
659
674
_ => continue ,
660
675
} ;
661
- if self . matches_names ( p , name) {
676
+ if self . matches_names ( self . map . get_parent ( idx ) , name) {
662
677
return Some ( idx)
663
678
}
664
679
}
@@ -707,8 +722,6 @@ impl<F: FoldOps> Folder for IdAndSpanUpdater<F> {
707
722
/// A Visitor that walks over an AST and collects Node's into an AST Map.
708
723
struct NodeCollector < ' ast > {
709
724
map : Vec < MapEntry < ' ast > > ,
710
- /// The node in which we are currently mapping (an item or a method).
711
- parent : NodeId ,
712
725
parent_node : NodeId ,
713
726
}
714
727
@@ -723,7 +736,7 @@ impl<'ast> NodeCollector<'ast> {
723
736
}
724
737
725
738
fn insert ( & mut self , id : NodeId , node : Node < ' ast > ) {
726
- let entry = MapEntry :: from_node ( self . parent , self . parent_node , node) ;
739
+ let entry = MapEntry :: from_node ( self . parent_node , node) ;
727
740
self . insert_entry ( id, entry) ;
728
741
}
729
742
@@ -737,10 +750,10 @@ impl<'ast> NodeCollector<'ast> {
737
750
impl < ' ast > Visitor < ' ast > for NodeCollector < ' ast > {
738
751
fn visit_item ( & mut self , i : & ' ast Item ) {
739
752
self . insert ( i. id , NodeItem ( i) ) ;
740
- let parent = self . parent ;
741
- self . parent = i. id ;
753
+
742
754
let parent_node = self . parent_node ;
743
755
self . parent_node = i. id ;
756
+
744
757
match i. node {
745
758
ItemImpl ( _, _, _, _, _, ref impl_items) => {
746
759
for ii in impl_items {
@@ -790,55 +803,51 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
790
803
_ => { }
791
804
}
792
805
visit:: walk_item ( self , i) ;
793
- self . parent = parent;
794
806
self . parent_node = parent_node;
795
807
}
796
808
797
809
fn visit_trait_item ( & mut self , ti : & ' ast TraitItem ) {
798
- let parent = self . parent ;
799
- self . parent = ti. id ;
800
810
let parent_node = self . parent_node ;
801
811
self . parent_node = ti. id ;
802
812
visit:: walk_trait_item ( self , ti) ;
803
- self . parent = parent;
804
813
self . parent_node = parent_node;
805
814
}
806
815
807
816
fn visit_impl_item ( & mut self , ii : & ' ast ImplItem ) {
808
- let parent = self . parent ;
809
- self . parent = ii. id ;
810
817
let parent_node = self . parent_node ;
811
818
self . parent_node = ii. id ;
819
+
812
820
visit:: walk_impl_item ( self , ii) ;
813
- self . parent = parent ;
821
+
814
822
self . parent_node = parent_node;
815
823
}
816
824
817
825
fn visit_pat ( & mut self , pat : & ' ast Pat ) {
818
- let parent_node = self . parent_node ;
819
- self . parent_node = pat. id ;
820
826
self . insert ( pat. id , match pat. node {
821
827
// Note: this is at least *potentially* a pattern...
822
828
PatIdent ( ..) => NodeLocal ( pat) ,
823
829
_ => NodePat ( pat)
824
830
} ) ;
831
+
832
+ let parent_node = self . parent_node ;
833
+ self . parent_node = pat. id ;
825
834
visit:: walk_pat ( self , pat) ;
826
835
self . parent_node = parent_node;
827
836
}
828
837
829
838
fn visit_expr ( & mut self , expr : & ' ast Expr ) {
839
+ self . insert ( expr. id , NodeExpr ( expr) ) ;
830
840
let parent_node = self . parent_node ;
831
841
self . parent_node = expr. id ;
832
- self . insert ( expr. id , NodeExpr ( expr) ) ;
833
842
visit:: walk_expr ( self , expr) ;
834
843
self . parent_node = parent_node;
835
844
}
836
845
837
846
fn visit_stmt ( & mut self , stmt : & ' ast Stmt ) {
838
847
let id = ast_util:: stmt_id ( stmt) ;
848
+ self . insert ( id, NodeStmt ( stmt) ) ;
839
849
let parent_node = self . parent_node ;
840
850
self . parent_node = id;
841
- self . insert ( id, NodeStmt ( stmt) ) ;
842
851
visit:: walk_stmt ( self , stmt) ;
843
852
self . parent_node = parent_node;
844
853
}
@@ -866,18 +875,15 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
866
875
}
867
876
868
877
fn visit_block ( & mut self , block : & ' ast Block ) {
878
+ self . insert ( block. id , NodeBlock ( block) ) ;
869
879
let parent_node = self . parent_node ;
870
880
self . parent_node = block. id ;
871
- self . insert ( block. id , NodeBlock ( block) ) ;
872
881
visit:: walk_block ( self , block) ;
873
882
self . parent_node = parent_node;
874
883
}
875
884
876
885
fn visit_lifetime_ref ( & mut self , lifetime : & ' ast Lifetime ) {
877
- let parent_node = self . parent_node ;
878
- self . parent_node = lifetime. id ;
879
886
self . insert ( lifetime. id , NodeLifetime ( lifetime) ) ;
880
- self . parent_node = parent_node;
881
887
}
882
888
883
889
fn visit_lifetime_def ( & mut self , def : & ' ast LifetimeDef ) {
@@ -901,7 +907,6 @@ pub fn map_crate<'ast, F: FoldOps>(forest: &'ast mut Forest, fold_ops: F) -> Map
901
907
902
908
let mut collector = NodeCollector {
903
909
map : vec ! [ ] ,
904
- parent : CRATE_NODE_ID ,
905
910
parent_node : CRATE_NODE_ID ,
906
911
} ;
907
912
collector. insert_entry ( CRATE_NODE_ID , RootCrate ) ;
@@ -957,12 +962,11 @@ pub fn map_decoded_item<'ast, F: FoldOps>(map: &Map<'ast>,
957
962
ii : ii
958
963
} ) ;
959
964
965
+ let ii_parent_id = fld. new_id ( DUMMY_NODE_ID ) ;
960
966
let mut collector = NodeCollector {
961
967
map : mem:: replace ( & mut * map. map . borrow_mut ( ) , vec ! [ ] ) ,
962
- parent : fld. new_id ( DUMMY_NODE_ID ) ,
963
- parent_node : fld. new_id ( DUMMY_NODE_ID ) ,
968
+ parent_node : ii_parent_id,
964
969
} ;
965
- let ii_parent_id = collector. parent ;
966
970
collector. insert_entry ( ii_parent_id, RootInlinedParent ( ii_parent) ) ;
967
971
visit:: walk_inlined_item ( & mut collector, & ii_parent. ii ) ;
968
972
0 commit comments