64
64
fn visit_impl_item ( & mut self , impl_item : & ' hir ImplItem < ' hir > ) {
65
65
self . visitor . visit_impl_item ( impl_item) ;
66
66
}
67
+
68
+ fn visit_foreign_item ( & mut self , foreign_item : & ' hir ForeignItem < ' hir > ) {
69
+ self . visitor . visit_foreign_item ( foreign_item) ;
70
+ }
67
71
}
68
72
69
73
pub trait IntoVisitor < ' hir > {
88
92
fn visit_impl_item ( & self , impl_item : & ' hir ImplItem < ' hir > ) {
89
93
self . 0 . into_visitor ( ) . visit_impl_item ( impl_item) ;
90
94
}
95
+
96
+ fn visit_foreign_item ( & self , foreign_item : & ' hir ForeignItem < ' hir > ) {
97
+ self . 0 . into_visitor ( ) . visit_foreign_item ( foreign_item) ;
98
+ }
91
99
}
92
100
93
101
#[ derive( Copy , Clone ) ]
@@ -128,6 +136,7 @@ pub trait Map<'hir> {
128
136
fn item ( & self , id : HirId ) -> & ' hir Item < ' hir > ;
129
137
fn trait_item ( & self , id : TraitItemId ) -> & ' hir TraitItem < ' hir > ;
130
138
fn impl_item ( & self , id : ImplItemId ) -> & ' hir ImplItem < ' hir > ;
139
+ fn foreign_item ( & self , id : ForeignItemId ) -> & ' hir ForeignItem < ' hir > ;
131
140
}
132
141
133
142
/// An erased version of `Map<'hir>`, using dynamic dispatch.
@@ -150,6 +159,9 @@ impl<'hir> Map<'hir> for ErasedMap<'hir> {
150
159
fn impl_item ( & self , id : ImplItemId ) -> & ' hir ImplItem < ' hir > {
151
160
self . 0 . impl_item ( id)
152
161
}
162
+ fn foreign_item ( & self , id : ForeignItemId ) -> & ' hir ForeignItem < ' hir > {
163
+ self . 0 . foreign_item ( id)
164
+ }
153
165
}
154
166
155
167
/// Specifies what nested things a visitor wants to visit. The most
@@ -277,6 +289,14 @@ pub trait Visitor<'v>: Sized {
277
289
walk_list ! ( self , visit_impl_item, opt_item) ;
278
290
}
279
291
292
+ /// Like `visit_nested_item()`, but for impl items. See
293
+ /// `visit_nested_item()` for advice on when to override this
294
+ /// method.
295
+ fn visit_nested_foreign_item ( & mut self , id : ForeignItemId ) {
296
+ let opt_item = self . nested_visit_map ( ) . inter ( ) . map ( |map| map. foreign_item ( id) ) ;
297
+ walk_list ! ( self , visit_foreign_item, opt_item) ;
298
+ }
299
+
280
300
/// Invoked to visit the body of a function, method or closure. Like
281
301
/// visit_nested_item, does nothing by default unless you override
282
302
/// `nested_visit_map` to return other than `None`, in which case it will walk
@@ -378,6 +398,9 @@ pub trait Visitor<'v>: Sized {
378
398
fn visit_impl_item ( & mut self , ii : & ' v ImplItem < ' v > ) {
379
399
walk_impl_item ( self , ii)
380
400
}
401
+ fn visit_foreign_item_ref ( & mut self , ii : & ' v ForeignItemRef < ' v > ) {
402
+ walk_foreign_item_ref ( self , ii)
403
+ }
381
404
fn visit_impl_item_ref ( & mut self , ii : & ' v ImplItemRef < ' v > ) {
382
405
walk_impl_item_ref ( self , ii)
383
406
}
@@ -568,7 +591,7 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item<'v>) {
568
591
}
569
592
ItemKind :: ForeignMod ( ref foreign_module) => {
570
593
visitor. visit_id ( item. hir_id ) ;
571
- walk_list ! ( visitor, visit_foreign_item , foreign_module. items) ;
594
+ walk_list ! ( visitor, visit_foreign_item_ref , foreign_module. items) ;
572
595
}
573
596
ItemKind :: GlobalAsm ( _) => {
574
597
visitor. visit_id ( item. hir_id ) ;
@@ -1012,6 +1035,17 @@ pub fn walk_impl_item<'v, V: Visitor<'v>>(visitor: &mut V, impl_item: &'v ImplIt
1012
1035
}
1013
1036
}
1014
1037
1038
+ pub fn walk_foreign_item_ref < ' v , V : Visitor < ' v > > (
1039
+ visitor : & mut V ,
1040
+ foreign_item_ref : & ' v ForeignItemRef < ' v > ,
1041
+ ) {
1042
+ // N.B., deliberately force a compilation error if/when new fields are added.
1043
+ let ForeignItemRef { id, ident, span : _, ref vis } = * foreign_item_ref;
1044
+ visitor. visit_nested_foreign_item ( id) ;
1045
+ visitor. visit_ident ( ident) ;
1046
+ visitor. visit_vis ( vis) ;
1047
+ }
1048
+
1015
1049
pub fn walk_impl_item_ref < ' v , V : Visitor < ' v > > ( visitor : & mut V , impl_item_ref : & ' v ImplItemRef < ' v > ) {
1016
1050
// N.B., deliberately force a compilation error if/when new fields are added.
1017
1051
let ImplItemRef { id, ident, ref kind, span : _, ref vis, ref defaultness } = * impl_item_ref;
0 commit comments