Roughly parse 2.0 macro syntax
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index e92937f..722c1a1 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -244,6 +244,8 @@
# [ cfg ( feature = "full" ) ]
fn fold_item_macro(&mut self, i: ItemMacro) -> ItemMacro { fold_item_macro(self, i) }
# [ cfg ( feature = "full" ) ]
+fn fold_item_macro2(&mut self, i: ItemMacro2) -> ItemMacro2 { fold_item_macro2(self, i) }
+# [ cfg ( feature = "full" ) ]
fn fold_item_mod(&mut self, i: ItemMod) -> ItemMod { fold_item_mod(self, i) }
# [ cfg ( feature = "full" ) ]
fn fold_item_static(&mut self, i: ItemStatic) -> ItemStatic { fold_item_static(self, i) }
@@ -1700,6 +1702,11 @@
_visitor.fold_item_macro(_binding_0),
)
}
+ Macro2(_binding_0, ) => {
+ Macro2 (
+ _visitor.fold_item_macro2(_binding_0),
+ )
+ }
}
}
# [ cfg ( feature = "full" ) ]
@@ -1797,6 +1804,17 @@
}
}
# [ cfg ( feature = "full" ) ]
+pub fn fold_item_macro2<V: Folder + ?Sized>(_visitor: &mut V, _i: ItemMacro2) -> ItemMacro2 {
+ ItemMacro2 {
+ attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
+ vis: _visitor.fold_visibility(_i . vis),
+ macro_token: _i . macro_token,
+ ident: _i . ident,
+ args: _i . args,
+ body: _i . body,
+ }
+}
+# [ cfg ( feature = "full" ) ]
pub fn fold_item_mod<V: Folder + ?Sized>(_visitor: &mut V, _i: ItemMod) -> ItemMod {
ItemMod {
attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 6e167b1..06697aa 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -217,6 +217,8 @@
# [ cfg ( feature = "full" ) ]
fn visit_item_macro(&mut self, i: &'ast ItemMacro) { visit_item_macro(self, i) }
# [ cfg ( feature = "full" ) ]
+fn visit_item_macro2(&mut self, i: &'ast ItemMacro2) { visit_item_macro2(self, i) }
+# [ cfg ( feature = "full" ) ]
fn visit_item_mod(&mut self, i: &'ast ItemMod) { visit_item_mod(self, i) }
# [ cfg ( feature = "full" ) ]
fn visit_item_static(&mut self, i: &'ast ItemStatic) { visit_item_static(self, i) }
@@ -1309,6 +1311,9 @@
Macro(ref _binding_0, ) => {
_visitor.visit_item_macro(&* _binding_0);
}
+ Macro2(ref _binding_0, ) => {
+ _visitor.visit_item_macro2(&* _binding_0);
+ }
}
}
# [ cfg ( feature = "full" ) ]
@@ -1390,6 +1395,15 @@
_visitor.visit_macro(&_i . mac);
}
# [ cfg ( feature = "full" ) ]
+pub fn visit_item_macro2<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ItemMacro2) {
+ for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
+ _visitor.visit_visibility(&_i . vis);
+ // Skipped field _i . macro_token;
+ // Skipped field _i . ident;
+ // Skipped field _i . args;
+ // Skipped field _i . body;
+}
+# [ cfg ( feature = "full" ) ]
pub fn visit_item_mod<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ItemMod) {
for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
_visitor.visit_visibility(&_i . vis);
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index d0c5113..3a91cd4 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -217,6 +217,8 @@
# [ cfg ( feature = "full" ) ]
fn visit_item_macro_mut(&mut self, i: &mut ItemMacro) { visit_item_macro_mut(self, i) }
# [ cfg ( feature = "full" ) ]
+fn visit_item_macro2_mut(&mut self, i: &mut ItemMacro2) { visit_item_macro2_mut(self, i) }
+# [ cfg ( feature = "full" ) ]
fn visit_item_mod_mut(&mut self, i: &mut ItemMod) { visit_item_mod_mut(self, i) }
# [ cfg ( feature = "full" ) ]
fn visit_item_static_mut(&mut self, i: &mut ItemStatic) { visit_item_static_mut(self, i) }
@@ -1309,6 +1311,9 @@
Macro(ref mut _binding_0, ) => {
_visitor.visit_item_macro_mut(&mut * _binding_0);
}
+ Macro2(ref mut _binding_0, ) => {
+ _visitor.visit_item_macro2_mut(&mut * _binding_0);
+ }
}
}
# [ cfg ( feature = "full" ) ]
@@ -1390,6 +1395,15 @@
_visitor.visit_macro_mut(&mut _i . mac);
}
# [ cfg ( feature = "full" ) ]
+pub fn visit_item_macro2_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ItemMacro2) {
+ for mut it in (_i . attrs).iter_mut() { _visitor.visit_attribute_mut(&mut it) };
+ _visitor.visit_visibility_mut(&mut _i . vis);
+ // Skipped field _i . macro_token;
+ // Skipped field _i . ident;
+ // Skipped field _i . args;
+ // Skipped field _i . body;
+}
+# [ cfg ( feature = "full" ) ]
pub fn visit_item_mod_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ItemMod) {
for mut it in (_i . attrs).iter_mut() { _visitor.visit_attribute_mut(&mut it) };
_visitor.visit_visibility_mut(&mut _i . vis);
diff --git a/src/item.rs b/src/item.rs
index 476bfbb..f7e3e91 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -189,6 +189,15 @@
pub ident: Option<Ident>,
pub mac: Macro,
}),
+ /// FIXME will need to revisit what this looks like in the AST.
+ pub Macro2(ItemMacro2 {
+ pub attrs: Vec<Attribute>,
+ pub vis: Visibility,
+ pub macro_token: Token![macro],
+ pub ident: Ident,
+ pub args: TokenTree,
+ pub body: TokenTree,
+ }),
}
}
@@ -483,6 +492,8 @@
syn!(ItemImpl) => { Item::Impl }
|
syn!(ItemMacro) => { Item::Macro }
+ |
+ syn!(ItemMacro2) => { Item::Macro2 }
));
impl_synom!(ItemMacro "macro item" do_parse!(
@@ -490,7 +501,7 @@
what: syn!(Path) >>
bang: punct!(!) >>
ident: option!(syn!(Ident)) >>
- body: call!(::TokenTree::parse_delimited) >>
+ body: call!(TokenTree::parse_delimited) >>
cond!(!body.is_braced(), punct!(;)) >>
(ItemMacro {
attrs: attrs,
@@ -503,6 +514,24 @@
})
));
+ // TODO: figure out the actual grammar; is body required to be braced?
+ impl_synom!(ItemMacro2 "macro2 item" do_parse!(
+ attrs: many0!(call!(Attribute::parse_outer)) >>
+ vis: syn!(Visibility) >>
+ macro_: keyword!(macro) >>
+ ident: syn!(Ident) >>
+ args: call!(TokenTree::parse_delimited) >>
+ body: call!(TokenTree::parse_delimited) >>
+ (ItemMacro2 {
+ attrs: attrs,
+ vis: vis,
+ macro_token: macro_,
+ ident: ident,
+ args: args,
+ body: body,
+ })
+ ));
+
impl_synom!(ItemExternCrate "extern crate item" do_parse!(
attrs: many0!(call!(Attribute::parse_outer)) >>
vis: syn!(Visibility) >>
@@ -1551,6 +1580,17 @@
}
}
+ impl ToTokens for ItemMacro2 {
+ fn to_tokens(&self, tokens: &mut Tokens) {
+ tokens.append_all(self.attrs.outer());
+ 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);
+ }
+ }
+
impl ToTokens for PathSimple {
fn to_tokens(&self, tokens: &mut Tokens) {
self.path.to_tokens(tokens);
diff --git a/src/lib.rs b/src/lib.rs
index 92f3386..40472c5 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -55,7 +55,7 @@
pub use item::{Constness, Defaultness, FnArg, FnDecl, ForeignItem, ItemForeignMod,
ImplItem, ImplPolarity, Item, MethodSig, PathListItem,
TraitItem, ViewPath, ItemExternCrate, ItemUse,
- ItemStatic, ItemConst, ItemFn, ItemMacro, ItemMod, ItemType, ItemEnum,
+ ItemStatic, ItemConst, ItemFn, ItemMacro, ItemMacro2, ItemMod, ItemType, ItemEnum,
ItemStruct, ItemUnion, ItemTrait, ItemDefaultImpl, ItemImpl,
PathSimple, PathGlob, PathList, ForeignItemFn, ForeignItemStatic, ForeignItemType,
TraitItemConst, TraitItemMacro, TraitItemMethod, TraitItemType,
diff --git a/synom/src/tokens.rs b/synom/src/tokens.rs
index 269da93..f2f1a89 100644
--- a/synom/src/tokens.rs
+++ b/synom/src/tokens.rs
@@ -185,6 +185,7 @@
(pub struct In => "in"),
(pub struct Let => "let"),
(pub struct Loop => "loop"),
+ (pub struct Macro => "macro"),
(pub struct Match => "match"),
(pub struct Mod => "mod"),
(pub struct Move => "move"),
@@ -277,6 +278,7 @@
(in) => { $crate::tokens::In };
(let) => { $crate::tokens::Let };
(loop) => { $crate::tokens::Loop };
+ (macro) => { $crate::tokens::Macro };
(match) => { $crate::tokens::Match };
(mod) => { $crate::tokens::Mod };
(move) => { $crate::tokens::Move };
@@ -370,6 +372,7 @@
($i:expr, in) => { call!($i, <$crate::tokens::In as $crate::Synom>::parse) };
($i:expr, let) => { call!($i, <$crate::tokens::Let as $crate::Synom>::parse) };
($i:expr, loop) => { call!($i, <$crate::tokens::Loop as $crate::Synom>::parse) };
+ ($i:expr, macro) => { call!($i, <$crate::tokens::Macro as $crate::Synom>::parse) };
($i:expr, match) => { call!($i, <$crate::tokens::Match as $crate::Synom>::parse) };
($i:expr, mod) => { call!($i, <$crate::tokens::Mod as $crate::Synom>::parse) };
($i:expr, move) => { call!($i, <$crate::tokens::Move as $crate::Synom>::parse) };