Add ForeignItem::Macro
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 53f9341..2499daf 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -354,6 +354,10 @@
         fold_foreign_item_fn(self, i)
     }
     #[cfg(feature = "full")]
+    fn fold_foreign_item_macro(&mut self, i: ForeignItemMacro) -> ForeignItemMacro {
+        fold_foreign_item_macro(self, i)
+    }
+    #[cfg(feature = "full")]
     fn fold_foreign_item_static(&mut self, i: ForeignItemStatic) -> ForeignItemStatic {
         fold_foreign_item_static(self, i)
     }
@@ -1702,6 +1706,9 @@
         ForeignItem::Type(_binding_0) => {
             ForeignItem::Type(_visitor.fold_foreign_item_type(_binding_0))
         }
+        ForeignItem::Macro(_binding_0) => {
+            ForeignItem::Macro(_visitor.fold_foreign_item_macro(_binding_0))
+        }
         ForeignItem::Verbatim(_binding_0) => {
             ForeignItem::Verbatim(_visitor.fold_foreign_item_verbatim(_binding_0))
         }
@@ -1721,6 +1728,17 @@
     }
 }
 #[cfg(feature = "full")]
+pub fn fold_foreign_item_macro<V: Fold + ?Sized>(
+    _visitor: &mut V,
+    _i: ForeignItemMacro,
+) -> ForeignItemMacro {
+    ForeignItemMacro {
+        attrs: FoldHelper::lift(_i.attrs, |it| _visitor.fold_attribute(it)),
+        mac: _visitor.fold_macro(_i.mac),
+        semi_token: (_i.semi_token).map(|it| Token ! [ ; ](tokens_helper(_visitor, &it.spans))),
+    }
+}
+#[cfg(feature = "full")]
 pub fn fold_foreign_item_static<V: Fold + ?Sized>(
     _visitor: &mut V,
     _i: ForeignItemStatic,
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 6505045..e2b2ba0 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -354,6 +354,10 @@
         visit_foreign_item_fn(self, i)
     }
     #[cfg(feature = "full")]
+    fn visit_foreign_item_macro(&mut self, i: &'ast ForeignItemMacro) {
+        visit_foreign_item_macro(self, i)
+    }
+    #[cfg(feature = "full")]
     fn visit_foreign_item_static(&mut self, i: &'ast ForeignItemStatic) {
         visit_foreign_item_static(self, i)
     }
@@ -1865,6 +1869,9 @@
         ForeignItem::Type(ref _binding_0) => {
             _visitor.visit_foreign_item_type(_binding_0);
         }
+        ForeignItem::Macro(ref _binding_0) => {
+            _visitor.visit_foreign_item_macro(_binding_0);
+        }
         ForeignItem::Verbatim(ref _binding_0) => {
             _visitor.visit_foreign_item_verbatim(_binding_0);
         }
@@ -1884,6 +1891,19 @@
     tokens_helper(_visitor, &_i.semi_token.spans);
 }
 #[cfg(feature = "full")]
+pub fn visit_foreign_item_macro<'ast, V: Visit<'ast> + ?Sized>(
+    _visitor: &mut V,
+    _i: &'ast ForeignItemMacro,
+) {
+    for it in &_i.attrs {
+        _visitor.visit_attribute(it)
+    }
+    _visitor.visit_macro(&_i.mac);
+    if let Some(ref it) = _i.semi_token {
+        tokens_helper(_visitor, &it.spans)
+    };
+}
+#[cfg(feature = "full")]
 pub fn visit_foreign_item_static<'ast, V: Visit<'ast> + ?Sized>(
     _visitor: &mut V,
     _i: &'ast ForeignItemStatic,
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 43c4a43..6bcc837 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -358,6 +358,10 @@
         visit_foreign_item_fn_mut(self, i)
     }
     #[cfg(feature = "full")]
+    fn visit_foreign_item_macro_mut(&mut self, i: &mut ForeignItemMacro) {
+        visit_foreign_item_macro_mut(self, i)
+    }
+    #[cfg(feature = "full")]
     fn visit_foreign_item_static_mut(&mut self, i: &mut ForeignItemStatic) {
         visit_foreign_item_static_mut(self, i)
     }
@@ -1842,6 +1846,9 @@
         ForeignItem::Type(ref mut _binding_0) => {
             _visitor.visit_foreign_item_type_mut(_binding_0);
         }
+        ForeignItem::Macro(ref mut _binding_0) => {
+            _visitor.visit_foreign_item_macro_mut(_binding_0);
+        }
         ForeignItem::Verbatim(ref mut _binding_0) => {
             _visitor.visit_foreign_item_verbatim_mut(_binding_0);
         }
@@ -1858,6 +1865,19 @@
     tokens_helper(_visitor, &mut _i.semi_token.spans);
 }
 #[cfg(feature = "full")]
+pub fn visit_foreign_item_macro_mut<V: VisitMut + ?Sized>(
+    _visitor: &mut V,
+    _i: &mut ForeignItemMacro,
+) {
+    for it in &mut _i.attrs {
+        _visitor.visit_attribute_mut(it)
+    }
+    _visitor.visit_macro_mut(&mut _i.mac);
+    if let Some(ref mut it) = _i.semi_token {
+        tokens_helper(_visitor, &mut it.spans)
+    };
+}
+#[cfg(feature = "full")]
 pub fn visit_foreign_item_static_mut<V: VisitMut + ?Sized>(
     _visitor: &mut V,
     _i: &mut ForeignItemStatic,
diff --git a/src/item.rs b/src/item.rs
index 7e49a4a..ffbd606 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -429,6 +429,15 @@
             pub semi_token: Token![;],
         }),
 
+        /// A macro invocation within an extern block.
+        ///
+        /// *This type is available if Syn is built with the `"full"` feature.*
+        pub Macro(ForeignItemMacro {
+            pub attrs: Vec<Attribute>,
+            pub mac: Macro,
+            pub semi_token: Option<Token![;]>,
+        }),
+
         /// Tokens in an `extern` block not interpreted by Syn.
         ///
         /// *This type is available if Syn is built with the `"full"` feature.*
@@ -1121,7 +1130,7 @@
         |
         syn!(ForeignItemType) => { ForeignItem::Type }
         |
-        call!(foreign_item_macro) => { ForeignItem::Verbatim }
+        syn!(ForeignItemMacro) => { ForeignItem::Macro }
     ));
 
     impl_synom!(ForeignItemFn "foreign function" do_parse!(
@@ -1196,14 +1205,14 @@
         })
     ));
 
-    named!(foreign_item_macro -> ForeignItemVerbatim, do_parse!(
-        begin: call!(verbatim::grab_cursor) >>
-        many0!(Attribute::parse_outer) >>
+    impl_synom!(ForeignItemMacro "macro in extern block" do_parse!(
+        attrs: many0!(Attribute::parse_outer) >>
         mac: syn!(Macro) >>
-        cond!(!is_brace(&mac.delimiter), punct!(;)) >>
-        end: call!(verbatim::grab_cursor) >>
-        (ForeignItemVerbatim {
-            tts: verbatim::token_range(begin..end),
+        semi: cond!(!is_brace(&mac.delimiter), punct!(;)) >>
+        (ForeignItemMacro {
+            attrs: attrs,
+            mac: mac,
+            semi_token: semi,
         })
     ));
 
@@ -2098,6 +2107,14 @@
         }
     }
 
+    impl ToTokens for ForeignItemMacro {
+        fn to_tokens(&self, tokens: &mut TokenStream) {
+            tokens.append_all(self.attrs.outer());
+            self.mac.to_tokens(tokens);
+            self.semi_token.to_tokens(tokens);
+        }
+    }
+
     impl ToTokens for ForeignItemVerbatim {
         fn to_tokens(&self, tokens: &mut TokenStream) {
             self.tts.to_tokens(tokens);
diff --git a/src/lib.rs b/src/lib.rs
index debb5b0..e09ea39 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -367,13 +367,13 @@
 mod item;
 #[cfg(feature = "full")]
 pub use item::{
-    ArgCaptured, ArgSelf, ArgSelfRef, FnArg, FnDecl, ForeignItem, ForeignItemFn, ForeignItemStatic,
-    ForeignItemType, ForeignItemVerbatim, ImplItem, ImplItemConst, ImplItemMacro, ImplItemMethod,
-    ImplItemType, ImplItemVerbatim, Item, ItemConst, ItemEnum, ItemExternCrate, ItemFn,
-    ItemForeignMod, ItemImpl, ItemMacro, ItemMacro2, ItemMod, ItemStatic, ItemStruct, ItemTrait,
-    ItemType, ItemUnion, ItemUse, ItemVerbatim, MethodSig, TraitItem, TraitItemConst,
-    TraitItemMacro, TraitItemMethod, TraitItemType, TraitItemVerbatim, UseGlob, UseGroup, UseName,
-    UsePath, UseRename, UseTree,
+    ArgCaptured, ArgSelf, ArgSelfRef, FnArg, FnDecl, ForeignItem, ForeignItemFn, ForeignItemMacro,
+    ForeignItemStatic, ForeignItemType, ForeignItemVerbatim, ImplItem, ImplItemConst,
+    ImplItemMacro, ImplItemMethod, ImplItemType, ImplItemVerbatim, Item, ItemConst, ItemEnum,
+    ItemExternCrate, ItemFn, ItemForeignMod, ItemImpl, ItemMacro, ItemMacro2, ItemMod, ItemStatic,
+    ItemStruct, ItemTrait, ItemType, ItemUnion, ItemUse, ItemVerbatim, MethodSig, TraitItem,
+    TraitItemConst, TraitItemMacro, TraitItemMethod, TraitItemType, TraitItemVerbatim, UseGlob,
+    UseGroup, UseName, UsePath, UseRename, UseTree,
 };
 
 #[cfg(feature = "full")]