Support folding/visiting over Ident and Span tokens
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 06697aa..8991a4a 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -184,6 +184,8 @@
 fn visit_generic_param(&mut self, i: &'ast GenericParam) { visit_generic_param(self, i) }
 
 fn visit_generics(&mut self, i: &'ast Generics) { visit_generics(self, i) }
+
+fn visit_ident(&mut self, i: &'ast Ident) { visit_ident(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_impl_item(&mut self, i: &'ast ImplItem) { visit_impl_item(self, i) }
 # [ cfg ( feature = "full" ) ]
@@ -302,6 +304,8 @@
 fn visit_range_limits(&mut self, i: &'ast RangeLimits) { visit_range_limits(self, i) }
 
 fn visit_return_type(&mut self, i: &'ast ReturnType) { visit_return_type(self, i) }
+
+fn visit_span(&mut self, i: &'ast Span) { visit_span(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_stmt(&mut self, i: &'ast Stmt) { visit_stmt(self, i) }
 
@@ -462,7 +466,7 @@
     use ::BareFnArgName::*;
     match *_i {
         Named(ref _binding_0, ) => {
-            // Skipped field * _binding_0;
+            _visitor.visit_ident(&* _binding_0);
         }
         Wild(ref _binding_0, ) => {
             // Skipped field * _binding_0;
@@ -633,7 +637,7 @@
 pub fn visit_const_param<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ConstParam) {
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     // Skipped field _i . const_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     // Skipped field _i . colon_token;
     _visitor.visit_type(&_i . ty);
     // Skipped field _i . eq_token;
@@ -661,7 +665,7 @@
 }
 
 pub fn visit_derive_input<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast DeriveInput) {
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     _visitor.visit_visibility(&_i . vis);
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_generics(&_i . generics);
@@ -750,7 +754,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_expr_field<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprField) {
     _visitor.visit_expr(&_i . expr);
-    // Skipped field _i . field;
+    _visitor.visit_ident(&_i . field);
     // Skipped field _i . dot_token;
 }
 # [ cfg ( feature = "full" ) ]
@@ -942,7 +946,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_expr_method_call<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprMethodCall) {
     _visitor.visit_expr(&_i . expr);
-    // Skipped field _i . method;
+    _visitor.visit_ident(&_i . method);
     for el in (_i . typarams).iter() { let it = el.item(); _visitor.visit_type(&it) };
     for el in (_i . args).iter() { let it = el.item(); _visitor.visit_expr(&it) };
     // Skipped field _i . paren_token;
@@ -1046,7 +1050,7 @@
 }
 
 pub fn visit_field<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Field) {
-    // Skipped field _i . ident;
+    if let Some(ref it) = _i . ident { _visitor.visit_ident(&* it) };
     _visitor.visit_visibility(&_i . vis);
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_type(&_i . ty);
@@ -1054,7 +1058,7 @@
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_field_pat<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast FieldPat) {
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     _visitor.visit_pat(&_i . pat);
     // Skipped field _i . is_shorthand;
     // Skipped field _i . colon_token;
@@ -1062,7 +1066,7 @@
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_field_value<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast FieldValue) {
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     _visitor.visit_expr(&_i . expr);
     // Skipped field _i . is_shorthand;
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
@@ -1121,7 +1125,7 @@
 pub fn visit_foreign_item_fn<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ForeignItemFn) {
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_visibility(&_i . vis);
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     _visitor.visit_fn_decl(&_i . decl);
     // Skipped field _i . semi_token;
 }
@@ -1131,7 +1135,7 @@
     _visitor.visit_visibility(&_i . vis);
     // Skipped field _i . static_token;
     _visitor.visit_mutability(&_i . mutbl);
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     // Skipped field _i . colon_token;
     _visitor.visit_type(&_i . ty);
     // Skipped field _i . semi_token;
@@ -1141,7 +1145,7 @@
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_visibility(&_i . vis);
     // Skipped field _i . type_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     // Skipped field _i . semi_token;
 }
 
@@ -1184,6 +1188,9 @@
     // Skipped field _i . gt_token;
     _visitor.visit_where_clause(&_i . where_clause);
 }
+
+pub fn visit_ident<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Ident) {
+}
 # [ cfg ( feature = "full" ) ]
 pub fn visit_impl_item<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ImplItem) {
     use ::ImplItem::*;
@@ -1208,7 +1215,7 @@
     _visitor.visit_visibility(&_i . vis);
     _visitor.visit_defaultness(&_i . defaultness);
     // Skipped field _i . const_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     // Skipped field _i . colon_token;
     _visitor.visit_type(&_i . ty);
     // Skipped field _i . eq_token;
@@ -1234,7 +1241,7 @@
     _visitor.visit_visibility(&_i . vis);
     _visitor.visit_defaultness(&_i . defaultness);
     // Skipped field _i . type_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     _visitor.visit_generics(&_i . generics);
     // Skipped field _i . eq_token;
     _visitor.visit_type(&_i . ty);
@@ -1321,7 +1328,7 @@
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_visibility(&_i . vis);
     // Skipped field _i . const_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     // Skipped field _i . colon_token;
     _visitor.visit_type(&_i . ty);
     // Skipped field _i . eq_token;
@@ -1343,7 +1350,7 @@
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_visibility(&_i . vis);
     // Skipped field _i . enum_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     _visitor.visit_generics(&_i . generics);
     // Skipped field _i . brace_token;
     for el in (_i . variants).iter() { let it = el.item(); _visitor.visit_variant(&it) };
@@ -1354,7 +1361,7 @@
     _visitor.visit_visibility(&_i . vis);
     // Skipped field _i . extern_token;
     // Skipped field _i . crate_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     // Skipped field _i . rename;
     // Skipped field _i . semi_token;
 }
@@ -1366,7 +1373,7 @@
     _visitor.visit_unsafety(&_i . unsafety);
     if let Some(ref it) = _i . abi { _visitor.visit_abi(&* it) };
     _visitor.visit_fn_decl(&_i . decl);
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     _visitor.visit_block(&_i . block);
 }
 # [ cfg ( feature = "full" ) ]
@@ -1391,7 +1398,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_item_macro<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ItemMacro) {
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
-    // Skipped field _i . ident;
+    if let Some(ref it) = _i . ident { _visitor.visit_ident(&* it) };
     _visitor.visit_macro(&_i . mac);
 }
 # [ cfg ( feature = "full" ) ]
@@ -1399,7 +1406,7 @@
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_visibility(&_i . vis);
     // Skipped field _i . macro_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     // Skipped field _i . args;
     // Skipped field _i . body;
 }
@@ -1408,7 +1415,7 @@
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_visibility(&_i . vis);
     // Skipped field _i . mod_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     // Skipped field _i . content;
     // Skipped field _i . semi;
 }
@@ -1418,7 +1425,7 @@
     _visitor.visit_visibility(&_i . vis);
     // Skipped field _i . static_token;
     _visitor.visit_mutability(&_i . mutbl);
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     // Skipped field _i . colon_token;
     _visitor.visit_type(&_i . ty);
     // Skipped field _i . eq_token;
@@ -1430,7 +1437,7 @@
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_visibility(&_i . vis);
     // Skipped field _i . struct_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     _visitor.visit_generics(&_i . generics);
     _visitor.visit_variant_data(&_i . data);
     // Skipped field _i . semi_token;
@@ -1442,7 +1449,7 @@
     _visitor.visit_unsafety(&_i . unsafety);
     // Skipped field _i . auto_token;
     // Skipped field _i . trait_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     _visitor.visit_generics(&_i . generics);
     // Skipped field _i . colon_token;
     for el in (_i . supertraits).iter() { let it = el.item(); _visitor.visit_type_param_bound(&it) };
@@ -1454,7 +1461,7 @@
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_visibility(&_i . vis);
     // Skipped field _i . type_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     _visitor.visit_generics(&_i . generics);
     // Skipped field _i . eq_token;
     _visitor.visit_type(&_i . ty);
@@ -1465,7 +1472,7 @@
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_visibility(&_i . vis);
     // Skipped field _i . union_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     _visitor.visit_generics(&_i . generics);
     _visitor.visit_variant_data(&_i . data);
 }
@@ -1517,7 +1524,7 @@
     use ::MetaItem::*;
     match *_i {
         Term(ref _binding_0, ) => {
-            // Skipped field * _binding_0;
+            _visitor.visit_ident(&* _binding_0);
         }
         List(ref _binding_0, ) => {
             _visitor.visit_meta_item_list(&* _binding_0);
@@ -1529,13 +1536,13 @@
 }
 
 pub fn visit_meta_item_list<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast MetaItemList) {
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     // Skipped field _i . paren_token;
     for el in (_i . nested).iter() { let it = el.item(); _visitor.visit_nested_meta_item(&it) };
 }
 
 pub fn visit_meta_name_value<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast MetaNameValue) {
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     // Skipped field _i . eq_token;
     // Skipped field _i . lit;
 }
@@ -1544,7 +1551,7 @@
     _visitor.visit_constness(&_i . constness);
     _visitor.visit_unsafety(&_i . unsafety);
     if let Some(ref it) = _i . abi { _visitor.visit_abi(&* it) };
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     _visitor.visit_fn_decl(&_i . decl);
 }
 
@@ -1630,7 +1637,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_pat_ident<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast PatIdent) {
     _visitor.visit_binding_mode(&_i . mode);
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     if let Some(ref it) = _i . subpat { _visitor.visit_pat(&* it) };
     // Skipped field _i . at_token;
 }
@@ -1721,20 +1728,20 @@
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_path_list_item<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast PathListItem) {
-    // Skipped field _i . name;
-    // Skipped field _i . rename;
+    _visitor.visit_ident(&_i . name);
+    if let Some(ref it) = _i . rename { _visitor.visit_ident(&* it) };
     // Skipped field _i . as_token;
 }
 
 pub fn visit_path_segment<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast PathSegment) {
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     _visitor.visit_path_arguments(&_i . arguments);
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_path_simple<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast PathSimple) {
     _visitor.visit_path(&_i . path);
     // Skipped field _i . as_token;
-    // Skipped field _i . rename;
+    if let Some(ref it) = _i . rename { _visitor.visit_ident(&* it) };
 }
 
 pub fn visit_poly_trait_ref<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast PolyTraitRef) {
@@ -1772,6 +1779,9 @@
         }
     }
 }
+
+pub fn visit_span<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Span) {
+}
 # [ cfg ( feature = "full" ) ]
 pub fn visit_stmt<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Stmt) {
     use ::Stmt::*;
@@ -1826,7 +1836,7 @@
 pub fn visit_trait_item_const<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast TraitItemConst) {
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     // Skipped field _i . const_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     // Skipped field _i . colon_token;
     _visitor.visit_type(&_i . ty);
     // Skipped field _i . default;
@@ -1848,7 +1858,7 @@
 pub fn visit_trait_item_type<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast TraitItemType) {
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     // Skipped field _i . type_token;
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     _visitor.visit_generics(&_i . generics);
     // Skipped field _i . colon_token;
     for el in (_i . bounds).iter() { let it = el.item(); _visitor.visit_type_param_bound(&it) };
@@ -1916,7 +1926,7 @@
 }
 
 pub fn visit_type_binding<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast TypeBinding) {
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     // Skipped field _i . eq_token;
     _visitor.visit_type(&_i . ty);
 }
@@ -1941,7 +1951,7 @@
 
 pub fn visit_type_param<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast TypeParam) {
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     // Skipped field _i . colon_token;
     for el in (_i . bounds).iter() { let it = el.item(); _visitor.visit_type_param_bound(&it) };
     // Skipped field _i . eq_token;
@@ -2024,7 +2034,7 @@
 }
 
 pub fn visit_variant<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Variant) {
-    // Skipped field _i . ident;
+    _visitor.visit_ident(&_i . ident);
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_variant_data(&_i . data);
     if let Some(ref it) = _i . discriminant { _visitor.visit_expr(&* it) };