Parse paren and bracket macros in statement position as expressions
diff --git a/src/expr.rs b/src/expr.rs
index 49d31c2..3074b99 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -293,14 +293,14 @@
#[cfg(feature = "parsing")]
pub mod parsing {
use super::*;
- use {BinOp, Delimited, DelimToken, FnArg, FnDecl, FunctionRetTy, Ident, Lifetime, TokenTree,
- Ty};
+ use {BinOp, Delimited, DelimToken, FnArg, FnDecl, FunctionRetTy, Ident, Lifetime, Mac,
+ TokenTree, Ty};
use attr::parsing::outer_attr;
use generics::parsing::lifetime;
use ident::parsing::ident;
use item::parsing::item;
use lit::parsing::{digits, lit};
- use mac::parsing::mac;
+ use mac::parsing::{mac, token_trees};
use nom::IResult::{self, Error};
use op::parsing::{assign_op, binop, unop};
use ty::parsing::{mutability, path, qpath, ty};
@@ -803,21 +803,24 @@
named!(stmt_mac -> Stmt, do_parse!(
attrs: many0!(outer_attr) >>
- mac: mac >>
- semi: option!(punct!(";")) >>
- ({
- let style = if semi.is_some() {
- MacStmtStyle::Semicolon
- } else if let Some(&TokenTree::Delimited(Delimited { delim, .. })) = mac.tts.last() {
- match delim {
- DelimToken::Paren | DelimToken::Bracket => MacStmtStyle::NoBraces,
- DelimToken::Brace => MacStmtStyle::Braces,
- }
- } else {
- MacStmtStyle::NoBraces
- };
- Stmt::Mac(Box::new((mac, style, attrs)))
- })
+ name: ident >>
+ punct!("!") >>
+ // Only parse braces here; paren and bracket will get parsed as
+ // expression statements
+ punct!("{") >>
+ tts: token_trees >>
+ punct!("}") >>
+ (Stmt::Mac(Box::new((
+ Mac {
+ path: name.into(),
+ tts: vec![TokenTree::Delimited(Delimited {
+ delim: DelimToken::Brace,
+ tts: tts,
+ })],
+ },
+ MacStmtStyle::Braces,
+ attrs,
+ ))))
));
named!(stmt_local -> Stmt, do_parse!(
diff --git a/src/mac.rs b/src/mac.rs
index 7e6e05c..091b226 100644
--- a/src/mac.rs
+++ b/src/mac.rs
@@ -133,19 +133,19 @@
named!(pub delimited -> Delimited, alt!(
delimited!(
punct!("("),
- many0!(token_tree),
+ token_trees,
punct!(")")
) => { |tts| Delimited { delim: DelimToken::Paren, tts: tts } }
|
delimited!(
punct!("["),
- many0!(token_tree),
+ token_trees,
punct!("]")
) => { |tts| Delimited { delim: DelimToken::Bracket, tts: tts } }
|
delimited!(
punct!("{"),
- many0!(token_tree),
+ token_trees,
punct!("}")
) => { |tts| Delimited { delim: DelimToken::Brace, tts: tts } }
));
diff --git a/src/nom.rs b/src/nom.rs
index c20fb68..50a3381 100644
--- a/src/nom.rs
+++ b/src/nom.rs
@@ -61,12 +61,13 @@
};
}
+// This is actually nom's cond_with_error.
macro_rules! cond {
($i:expr, $cond:expr, $submac:ident!( $($args:tt)* )) => {
if $cond {
match $submac!($i, $($args)*) {
$crate::nom::IResult::Done(i, o) => $crate::nom::IResult::Done(i, ::std::option::Option::Some(o)),
- $crate::nom::IResult::Error => $crate::nom::IResult::Done($i, ::std::option::Option::None),
+ $crate::nom::IResult::Error => $crate::nom::IResult::Error,
}
} else {
$crate::nom::IResult::Done($i, ::std::option::Option::None)