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")]