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);