Separate delimiter and tokenstream in macro ast
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 3013ab5..3faa53c 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -252,6 +252,8 @@
 
 fn fold_macro(&mut self, i: Macro) -> Macro { fold_macro(self, i) }
 
+fn fold_macro_delimiter(&mut self, i: MacroDelimiter) -> MacroDelimiter { fold_macro_delimiter(self, i) }
+
 fn fold_member(&mut self, i: Member) -> Member { fold_member(self, i) }
 
 fn fold_meta_item(&mut self, i: MetaItem) -> MetaItem { fold_meta_item(self, i) }
@@ -1798,7 +1800,9 @@
         vis: _visitor.fold_visibility(_i . vis),
         macro_token: Token ! [ macro ](tokens_helper(_visitor, &(_i . macro_token).0)),
         ident: _visitor.fold_ident(_i . ident),
+        paren_token: Paren(tokens_helper(_visitor, &(_i . paren_token).0)),
         args: _i . args,
+        brace_token: Brace(tokens_helper(_visitor, &(_i . brace_token).0)),
         body: _i . body,
     }
 }
@@ -1946,7 +1950,29 @@
     Macro {
         path: _visitor.fold_path(_i . path),
         bang_token: Token ! [ ! ](tokens_helper(_visitor, &(_i . bang_token).0)),
-        tt: _i . tt,
+        delimiter: _visitor.fold_macro_delimiter(_i . delimiter),
+        tts: _i . tts,
+    }
+}
+
+pub fn fold_macro_delimiter<V: Folder + ?Sized>(_visitor: &mut V, _i: MacroDelimiter) -> MacroDelimiter {
+    use ::MacroDelimiter::*;
+    match _i {
+        Paren(_binding_0, ) => {
+            Paren (
+                Paren(tokens_helper(_visitor, &(_binding_0).0)),
+            )
+        }
+        Brace(_binding_0, ) => {
+            Brace (
+                Brace(tokens_helper(_visitor, &(_binding_0).0)),
+            )
+        }
+        Bracket(_binding_0, ) => {
+            Bracket (
+                Bracket(tokens_helper(_visitor, &(_binding_0).0)),
+            )
+        }
     }
 }
 
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 120d1fd..6beacf0 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -248,6 +248,8 @@
 
 fn visit_macro(&mut self, i: &'ast Macro) { visit_macro(self, i) }
 
+fn visit_macro_delimiter(&mut self, i: &'ast MacroDelimiter) { visit_macro_delimiter(self, i) }
+
 fn visit_member(&mut self, i: &'ast Member) { visit_member(self, i) }
 
 fn visit_meta_item(&mut self, i: &'ast MetaItem) { visit_meta_item(self, i) }
@@ -1408,7 +1410,9 @@
     _visitor.visit_visibility(& _i . vis);
     tokens_helper(_visitor, &(& _i . macro_token).0);
     _visitor.visit_ident(& _i . ident);
+    tokens_helper(_visitor, &(& _i . paren_token).0);
     // Skipped field _i . args;
+    tokens_helper(_visitor, &(& _i . brace_token).0);
     // Skipped field _i . body;
 }
 # [ cfg ( feature = "full" ) ]
@@ -1535,7 +1539,23 @@
 pub fn visit_macro<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Macro) {
     _visitor.visit_path(& _i . path);
     tokens_helper(_visitor, &(& _i . bang_token).0);
-    // Skipped field _i . tt;
+    _visitor.visit_macro_delimiter(& _i . delimiter);
+    // Skipped field _i . tts;
+}
+
+pub fn visit_macro_delimiter<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast MacroDelimiter) {
+    use ::MacroDelimiter::*;
+    match *_i {
+        Paren(ref _binding_0, ) => {
+            tokens_helper(_visitor, &(_binding_0).0);
+        }
+        Brace(ref _binding_0, ) => {
+            tokens_helper(_visitor, &(_binding_0).0);
+        }
+        Bracket(ref _binding_0, ) => {
+            tokens_helper(_visitor, &(_binding_0).0);
+        }
+    }
 }
 
 pub fn visit_member<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Member) {
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 00d9c17..9c164dc 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -248,6 +248,8 @@
 
 fn visit_macro_mut(&mut self, i: &mut Macro) { visit_macro_mut(self, i) }
 
+fn visit_macro_delimiter_mut(&mut self, i: &mut MacroDelimiter) { visit_macro_delimiter_mut(self, i) }
+
 fn visit_member_mut(&mut self, i: &mut Member) { visit_member_mut(self, i) }
 
 fn visit_meta_item_mut(&mut self, i: &mut MetaItem) { visit_meta_item_mut(self, i) }
@@ -1408,7 +1410,9 @@
     _visitor.visit_visibility_mut(& mut _i . vis);
     tokens_helper(_visitor, &mut (& mut _i . macro_token).0);
     _visitor.visit_ident_mut(& mut _i . ident);
+    tokens_helper(_visitor, &mut (& mut _i . paren_token).0);
     // Skipped field _i . args;
+    tokens_helper(_visitor, &mut (& mut _i . brace_token).0);
     // Skipped field _i . body;
 }
 # [ cfg ( feature = "full" ) ]
@@ -1535,7 +1539,23 @@
 pub fn visit_macro_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Macro) {
     _visitor.visit_path_mut(& mut _i . path);
     tokens_helper(_visitor, &mut (& mut _i . bang_token).0);
-    // Skipped field _i . tt;
+    _visitor.visit_macro_delimiter_mut(& mut _i . delimiter);
+    // Skipped field _i . tts;
+}
+
+pub fn visit_macro_delimiter_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut MacroDelimiter) {
+    use ::MacroDelimiter::*;
+    match *_i {
+        Paren(ref mut _binding_0, ) => {
+            tokens_helper(_visitor, &mut (_binding_0).0);
+        }
+        Brace(ref mut _binding_0, ) => {
+            tokens_helper(_visitor, &mut (_binding_0).0);
+        }
+        Bracket(ref mut _binding_0, ) => {
+            tokens_helper(_visitor, &mut (_binding_0).0);
+        }
+    }
 }
 
 pub fn visit_member_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Member) {