Separate delimiter and tokenstream in macro ast
diff --git a/src/item.rs b/src/item.rs
index 90b70f0..1953756 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -1,9 +1,10 @@
use super::*;
use delimited::Delimited;
-use proc_macro2::{TokenTree, TokenStream};
+use proc_macro2::{TokenStream};
+use token::{Paren, Brace};
#[cfg(feature = "extra-traits")]
-use mac::{TokenTreeHelper, TokenStreamHelper};
+use mac::TokenStreamHelper;
#[cfg(feature = "extra-traits")]
use std::hash::{Hash, Hasher};
@@ -186,14 +187,15 @@
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 {
pub attrs: Vec<Attribute>,
pub vis: Visibility,
pub macro_token: Token![macro],
pub ident: Ident,
- pub args: TokenTree,
- pub body: TokenTree,
+ pub paren_token: Paren,
+ pub args: TokenStream,
+ pub brace_token: Brace,
+ pub body: TokenStream,
}),
pub Verbatim(ItemVerbatim #manual_extra_traits {
pub tts: TokenStream,
@@ -208,9 +210,10 @@
impl PartialEq for ItemMacro2 {
fn eq(&self, other: &Self) -> bool {
self.attrs == other.attrs && self.vis == other.vis && self.macro_token == other.macro_token
- && self.ident == other.ident
- && TokenTreeHelper(&self.args) == TokenTreeHelper(&other.args)
- && TokenTreeHelper(&self.body) == TokenTreeHelper(&other.body)
+ && self.ident == other.ident && self.paren_token == other.paren_token
+ && TokenStreamHelper(&self.args) == TokenStreamHelper(&other.args)
+ && self.brace_token == other.brace_token
+ && TokenStreamHelper(&self.body) == TokenStreamHelper(&other.body)
}
}
@@ -224,8 +227,10 @@
self.vis.hash(state);
self.macro_token.hash(state);
self.ident.hash(state);
- TokenTreeHelper(&self.args).hash(state);
- TokenTreeHelper(&self.body).hash(state);
+ self.paren_token.hash(state);
+ TokenStreamHelper(&self.args).hash(state);
+ self.brace_token.hash(state);
+ TokenStreamHelper(&self.body).hash(state);
}
}
@@ -531,7 +536,6 @@
use super::*;
use synom::{Synom, Cursor, PResult};
- use proc_macro2::{TokenNode, Delimiter};
impl_synom!(Item "item" alt!(
syn!(ItemExternCrate) => { Item::ExternCrate }
@@ -573,14 +577,15 @@
bang: punct!(!) >>
ident: option!(syn!(Ident)) >>
body: call!(tt::delimited) >>
- semi: cond!(!is_braced(&body), punct!(;)) >>
+ semi: cond!(!is_brace(&body.0), punct!(;)) >>
(ItemMacro {
attrs: attrs,
ident: ident,
mac: Macro {
path: what,
bang_token: bang,
- tt: body,
+ delimiter: body.0,
+ tts: body.1,
},
semi_token: semi,
})
@@ -599,8 +604,10 @@
vis: vis,
macro_token: macro_,
ident: ident,
- args: args,
- body: body,
+ paren_token: args.0,
+ args: args.1,
+ brace_token: body.0,
+ body: body.1,
})
));
@@ -1195,7 +1202,7 @@
impl_synom!(TraitItemMacro "trait item macro" do_parse!(
attrs: many0!(Attribute::parse_outer) >>
mac: syn!(Macro) >>
- semi: cond!(!is_braced(&mac.tt), punct!(;)) >>
+ semi: cond!(!is_brace(&mac.delimiter), punct!(;)) >>
(TraitItemMacro {
attrs: attrs,
mac: mac,
@@ -1348,7 +1355,7 @@
impl_synom!(ImplItemMacro "macro in impl block" do_parse!(
attrs: many0!(Attribute::parse_outer) >>
mac: syn!(Macro) >>
- semi: cond!(!is_braced(&mac.tt), punct!(;)) >>
+ semi: cond!(!is_brace(&mac.delimiter), punct!(;)) >>
(ImplItemMacro {
attrs: attrs,
mac: mac,
@@ -1356,10 +1363,10 @@
})
));
- fn is_braced(tt: &TokenTree) -> bool {
- match tt.kind {
- TokenNode::Group(Delimiter::Brace, _) => true,
- _ => false,
+ fn is_brace(delimiter: &MacroDelimiter) -> bool {
+ match *delimiter {
+ MacroDelimiter::Brace(_) => true,
+ MacroDelimiter::Paren(_) | MacroDelimiter::Bracket(_) => false,
}
}
}
@@ -1582,7 +1589,17 @@
self.mac.path.to_tokens(tokens);
self.mac.bang_token.to_tokens(tokens);
self.ident.to_tokens(tokens);
- self.mac.tt.to_tokens(tokens);
+ match self.mac.delimiter {
+ MacroDelimiter::Paren(ref paren) => {
+ paren.surround(tokens, |tokens| self.mac.tts.to_tokens(tokens));
+ }
+ MacroDelimiter::Brace(ref brace) => {
+ brace.surround(tokens, |tokens| self.mac.tts.to_tokens(tokens));
+ }
+ MacroDelimiter::Bracket(ref bracket) => {
+ bracket.surround(tokens, |tokens| self.mac.tts.to_tokens(tokens));
+ }
+ }
self.semi_token.to_tokens(tokens);
}
}
@@ -1593,8 +1610,12 @@
self.vis.to_tokens(tokens);
self.macro_token.to_tokens(tokens);
self.ident.to_tokens(tokens);
- self.args.to_tokens(tokens);
- self.body.to_tokens(tokens);
+ self.paren_token.surround(tokens, |tokens| {
+ self.args.to_tokens(tokens);
+ });
+ self.brace_token.surround(tokens, |tokens| {
+ self.body.to_tokens(tokens);
+ });
}
}