Save the macro item semicolon
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index d6939aa..c8f1ae4 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -1567,6 +1567,7 @@
     ImplItemMacro {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
         mac: _visitor.fold_macro(_i . mac),
+        semi_token: _i . semi_token,
     }
 }
 # [ cfg ( feature = "full" ) ]
@@ -1806,6 +1807,7 @@
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
         ident: (_i . ident).map(|it| { _visitor.fold_ident(it) }),
         mac: _visitor.fold_macro(_i . mac),
+        semi_token: _i . semi_token,
     }
 }
 # [ cfg ( feature = "full" ) ]
@@ -2380,6 +2382,7 @@
     TraitItemMacro {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
         mac: _visitor.fold_macro(_i . mac),
+        semi_token: _i . semi_token,
     }
 }
 # [ cfg ( feature = "full" ) ]
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index a9021c7..72d955d 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -1221,6 +1221,7 @@
 pub fn visit_impl_item_macro<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ImplItemMacro) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
     _visitor.visit_macro(& _i . mac);
+    // Skipped field _i . semi_token;
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_impl_item_method<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ImplItemMethod) {
@@ -1400,6 +1401,7 @@
     for it in & _i . attrs { _visitor.visit_attribute(it) };
     if let Some(ref it) = _i . ident { _visitor.visit_ident(it) };
     _visitor.visit_macro(& _i . mac);
+    // Skipped field _i . semi_token;
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_item_macro2<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ItemMacro2) {
@@ -1835,6 +1837,7 @@
 pub fn visit_trait_item_macro<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast TraitItemMacro) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
     _visitor.visit_macro(& _i . mac);
+    // Skipped field _i . semi_token;
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_trait_item_method<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast TraitItemMethod) {
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index b75114c..b0a80ba 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -1221,6 +1221,7 @@
 pub fn visit_impl_item_macro_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ImplItemMacro) {
     for mut it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
     _visitor.visit_macro_mut(& mut _i . mac);
+    // Skipped field _i . semi_token;
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_impl_item_method_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ImplItemMethod) {
@@ -1400,6 +1401,7 @@
     for mut it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
     if let Some(ref mut it) = _i . ident { _visitor.visit_ident_mut(it) };
     _visitor.visit_macro_mut(& mut _i . mac);
+    // Skipped field _i . semi_token;
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_item_macro2_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ItemMacro2) {
@@ -1835,6 +1837,7 @@
 pub fn visit_trait_item_macro_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut TraitItemMacro) {
     for mut it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
     _visitor.visit_macro_mut(& mut _i . mac);
+    // Skipped field _i . semi_token;
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_trait_item_method_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut TraitItemMethod) {
diff --git a/src/item.rs b/src/item.rs
index e94280a..6027065 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -196,6 +196,7 @@
             /// The `example` in `macro_rules! example { ... }`.
             pub ident: Option<Ident>,
             pub mac: Macro,
+            pub semi_token: Option<Token![;]>,
         }),
         /// FIXME will need to revisit what this looks like in the AST.
         pub Macro2(ItemMacro2 #manual_extra_traits {
@@ -365,6 +366,7 @@
         pub Macro(TraitItemMacro {
             pub attrs: Vec<Attribute>,
             pub mac: Macro,
+            pub semi_token: Option<Token![;]>,
         }),
     }
 }
@@ -414,6 +416,7 @@
         pub Macro(ImplItemMacro {
             pub attrs: Vec<Attribute>,
             pub mac: Macro,
+            pub semi_token: Option<Token![;]>,
         }),
     }
 }
@@ -474,6 +477,7 @@
     use super::*;
 
     use synom::Synom;
+    use proc_macro2::{TokenNode, Delimiter};
 
     impl_synom!(Item "item" alt!(
         syn!(ItemExternCrate) => { Item::ExternCrate }
@@ -515,7 +519,7 @@
         bang: punct!(!) >>
         ident: option!(syn!(Ident)) >>
         body: call!(tt::delimited) >>
-        cond!(!mac::is_braced(&body), punct!(;)) >>
+        semi: cond!(!is_braced(&body), punct!(;)) >>
         (ItemMacro {
             attrs: attrs,
             ident: ident,
@@ -524,6 +528,7 @@
                 bang_token: bang,
                 tokens: body,
             },
+            semi_token: semi,
         })
     ));
 
@@ -1145,10 +1150,11 @@
     impl_synom!(TraitItemMacro "trait item macro" do_parse!(
         attrs: many0!(Attribute::parse_outer) >>
         mac: syn!(Macro) >>
-        cond!(!mac::is_braced(&mac.tokens), punct!(;)) >>
+        semi: cond!(!is_braced(&mac.tokens), punct!(;)) >>
         (TraitItemMacro {
             attrs: attrs,
             mac: mac,
+            semi_token: semi,
         })
     ));
 
@@ -1298,10 +1304,11 @@
     impl_synom!(ImplItemMacro "macro in impl block" do_parse!(
         attrs: many0!(Attribute::parse_outer) >>
         mac: syn!(Macro) >>
-        cond!(!mac::is_braced(&mac.tokens), punct!(;)) >>
+        semi: cond!(!is_braced(&mac.tokens), punct!(;)) >>
         (ImplItemMacro {
             attrs: attrs,
             mac: mac,
+            semi_token: semi,
         })
     ));
 
@@ -1328,6 +1335,13 @@
             epsilon!() => { |_| Defaultness::Final }
         ));
     }
+
+    fn is_braced(tt: &TokenTree) -> bool {
+        match tt.kind {
+            TokenNode::Group(Delimiter::Brace, _) => true,
+            _ => false,
+        }
+    }
 }
 
 #[cfg(feature = "printing")]
@@ -1561,9 +1575,7 @@
             self.mac.bang_token.to_tokens(tokens);
             self.ident.to_tokens(tokens);
             self.mac.tokens.to_tokens(tokens);
-            if !mac::is_braced(&self.mac.tokens) {
-                <Token![;]>::default().to_tokens(tokens);
-            }
+            self.semi_token.to_tokens(tokens);
         }
     }
 
@@ -1658,9 +1670,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             tokens.append_all(self.attrs.outer());
             self.mac.to_tokens(tokens);
-            if !mac::is_braced(&self.mac.tokens) {
-                <Token![;]>::default().to_tokens(tokens);
-            }
+            self.semi_token.to_tokens(tokens);
         }
     }
 
@@ -1710,10 +1720,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             tokens.append_all(self.attrs.outer());
             self.mac.to_tokens(tokens);
-            if !mac::is_braced(&self.mac.tokens) {
-                // FIXME needs a span
-                <Token![;]>::default().to_tokens(tokens);
-            }
+            self.semi_token.to_tokens(tokens);
         }
     }
 
diff --git a/src/mac.rs b/src/mac.rs
index 0623c06..e013f92 100644
--- a/src/mac.rs
+++ b/src/mac.rs
@@ -1,9 +1,9 @@
 use super::*;
 
-use proc_macro2::{Delimiter, TokenNode, TokenTree};
+use proc_macro2::TokenTree;
 
 #[cfg(feature = "extra-traits")]
-use proc_macro2::TokenStream;
+use proc_macro2::{TokenStream, TokenNode, Delimiter};
 #[cfg(feature = "extra-traits")]
 use std::hash::{Hash, Hasher};
 
@@ -41,13 +41,6 @@
     }
 }
 
-pub fn is_braced(tt: &TokenTree) -> bool {
-    match tt.kind {
-        TokenNode::Group(Delimiter::Brace, _) => true,
-        _ => false,
-    }
-}
-
 #[cfg(feature = "extra-traits")]
 pub struct TokenTreeHelper<'a>(pub &'a TokenTree);