Make a struct for loop labels
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index d5b63ae..df1f9d6 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -235,6 +235,8 @@
 fn visit_item_use(&mut self, i: &'ast ItemUse) { visit_item_use(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_item_verbatim(&mut self, i: &'ast ItemVerbatim) { visit_item_verbatim(self, i) }
+# [ cfg ( feature = "full" ) ]
+fn visit_label(&mut self, i: &'ast Label) { visit_label(self, i) }
 
 fn visit_lifetime(&mut self, i: &'ast Lifetime) { visit_lifetime(self, i) }
 
@@ -846,8 +848,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_expr_for_loop<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprForLoop) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
-    if let Some(ref it) = _i . label { _visitor.visit_lifetime(it) };
-    if let Some(ref it) = _i . colon_token { tokens_helper(_visitor, &(it).0) };
+    if let Some(ref it) = _i . label { _visitor.visit_label(it) };
     tokens_helper(_visitor, &(& _i . for_token).0);
     _visitor.visit_pat(& * _i . pat);
     tokens_helper(_visitor, &(& _i . in_token).0);
@@ -907,8 +908,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_expr_loop<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprLoop) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
-    if let Some(ref it) = _i . label { _visitor.visit_lifetime(it) };
-    if let Some(ref it) = _i . colon_token { tokens_helper(_visitor, &(it).0) };
+    if let Some(ref it) = _i . label { _visitor.visit_label(it) };
     tokens_helper(_visitor, &(& _i . loop_token).0);
     _visitor.visit_block(& _i . body);
 }
@@ -1015,8 +1015,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_expr_while<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprWhile) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
-    if let Some(ref it) = _i . label { _visitor.visit_lifetime(it) };
-    if let Some(ref it) = _i . colon_token { tokens_helper(_visitor, &(it).0) };
+    if let Some(ref it) = _i . label { _visitor.visit_label(it) };
     tokens_helper(_visitor, &(& _i . while_token).0);
     _visitor.visit_expr(& * _i . cond);
     _visitor.visit_block(& _i . body);
@@ -1024,8 +1023,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_expr_while_let<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprWhileLet) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
-    if let Some(ref it) = _i . label { _visitor.visit_lifetime(it) };
-    if let Some(ref it) = _i . colon_token { tokens_helper(_visitor, &(it).0) };
+    if let Some(ref it) = _i . label { _visitor.visit_label(it) };
     tokens_helper(_visitor, &(& _i . while_token).0);
     tokens_helper(_visitor, &(& _i . let_token).0);
     _visitor.visit_pat(& * _i . pat);
@@ -1494,6 +1492,11 @@
 pub fn visit_item_verbatim<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ItemVerbatim) {
     // Skipped field _i . tts;
 }
+# [ cfg ( feature = "full" ) ]
+pub fn visit_label<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Label) {
+    _visitor.visit_lifetime(& _i . name);
+    tokens_helper(_visitor, &(& _i . colon_token).0);
+}
 
 pub fn visit_lifetime<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Lifetime) {
     // Skipped field _i . sym;