6464 fn visit_impl_item ( & mut self , impl_item : & ' hir ImplItem < ' hir > ) {
6565 self . visitor . visit_impl_item ( impl_item) ;
6666 }
67+
68+ fn visit_foreign_item ( & mut self , foreign_item : & ' hir ForeignItem < ' hir > ) {
69+ self . visitor . visit_foreign_item ( foreign_item) ;
70+ }
6771}
6872
6973pub trait IntoVisitor < ' hir > {
8892 fn visit_impl_item ( & self , impl_item : & ' hir ImplItem < ' hir > ) {
8993 self . 0 . into_visitor ( ) . visit_impl_item ( impl_item) ;
9094 }
95+
96+ fn visit_foreign_item ( & self , foreign_item : & ' hir ForeignItem < ' hir > ) {
97+ self . 0 . into_visitor ( ) . visit_foreign_item ( foreign_item) ;
98+ }
9199}
92100
93101#[ derive( Copy , Clone ) ]
@@ -128,6 +136,7 @@ pub trait Map<'hir> {
128136 fn item ( & self , id : HirId ) -> & ' hir Item < ' hir > ;
129137 fn trait_item ( & self , id : TraitItemId ) -> & ' hir TraitItem < ' hir > ;
130138 fn impl_item ( & self , id : ImplItemId ) -> & ' hir ImplItem < ' hir > ;
139+ fn foreign_item ( & self , id : ForeignItemId ) -> & ' hir ForeignItem < ' hir > ;
131140}
132141
133142/// An erased version of `Map<'hir>`, using dynamic dispatch.
@@ -150,6 +159,9 @@ impl<'hir> Map<'hir> for ErasedMap<'hir> {
150159 fn impl_item ( & self , id : ImplItemId ) -> & ' hir ImplItem < ' hir > {
151160 self . 0 . impl_item ( id)
152161 }
162+ fn foreign_item ( & self , id : ForeignItemId ) -> & ' hir ForeignItem < ' hir > {
163+ self . 0 . foreign_item ( id)
164+ }
153165}
154166
155167/// Specifies what nested things a visitor wants to visit. The most
@@ -277,6 +289,14 @@ pub trait Visitor<'v>: Sized {
277289 walk_list ! ( self , visit_impl_item, opt_item) ;
278290 }
279291
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+
280300 /// Invoked to visit the body of a function, method or closure. Like
281301 /// visit_nested_item, does nothing by default unless you override
282302 /// `nested_visit_map` to return other than `None`, in which case it will walk
@@ -378,6 +398,9 @@ pub trait Visitor<'v>: Sized {
378398 fn visit_impl_item ( & mut self , ii : & ' v ImplItem < ' v > ) {
379399 walk_impl_item ( self , ii)
380400 }
401+ fn visit_foreign_item_ref ( & mut self , ii : & ' v ForeignItemRef < ' v > ) {
402+ walk_foreign_item_ref ( self , ii)
403+ }
381404 fn visit_impl_item_ref ( & mut self , ii : & ' v ImplItemRef < ' v > ) {
382405 walk_impl_item_ref ( self , ii)
383406 }
@@ -568,7 +591,7 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item<'v>) {
568591 }
569592 ItemKind :: ForeignMod ( ref foreign_module) => {
570593 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) ;
572595 }
573596 ItemKind :: GlobalAsm ( _) => {
574597 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
10121035 }
10131036}
10141037
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+
10151049pub fn walk_impl_item_ref < ' v , V : Visitor < ' v > > ( visitor : & mut V , impl_item_ref : & ' v ImplItemRef < ' v > ) {
10161050 // N.B., deliberately force a compilation error if/when new fields are added.
10171051 let ImplItemRef { id, ident, ref kind, span : _, ref vis, ref defaultness } = * impl_item_ref;
0 commit comments