Relax comma rules in match arms
This was updated recently (rust-lang/rust#40989) so update syn to match
diff --git a/src/expr.rs b/src/expr.rs
index 1356fa8..fb71ef7 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -624,11 +624,20 @@
#[cfg(any(feature = "parsing", feature = "printing"))]
#[cfg(feature = "full")]
-fn arm_requires_comma(arm: &Arm) -> bool {
- if let ExprKind::Block(ExprBlock { unsafety: Unsafety::Normal, .. }) = arm.body.node {
- false
- } else {
- true
+fn arm_expr_requires_comma(expr: &Expr) -> bool {
+ // see https://github.com/rust-lang/rust/blob/eb8f2586e
+ // /src/libsyntax/parse/classify.rs#L17-L37
+ match expr.node {
+ ExprKind::Block(..) |
+ ExprKind::If(..) |
+ ExprKind::IfLet(..) |
+ ExprKind::Match(..) |
+ ExprKind::While(..) |
+ ExprKind::WhileLet(..) |
+ ExprKind::Loop(..) |
+ ExprKind::ForLoop(..) |
+ ExprKind::Catch(..) => false,
+ _ => true,
}
}
@@ -1448,33 +1457,14 @@
named!(parse -> Self, do_parse!(
match_: syn!(Match) >>
obj: expr_no_struct >>
- res: braces!(do_parse!(
- mut arms: many0!(do_parse!(
- arm: syn!(Arm) >>
- cond!(arm_requires_comma(&arm), syn!(Comma)) >>
- cond!(!arm_requires_comma(&arm), option!(syn!(Comma))) >>
- (arm)
- )) >>
- last_arm: option!(syn!(Arm)) >>
- ({
- arms.extend(last_arm);
- arms
- })
- )) >>
+ res: braces!(many0!(syn!(Arm))) >>
({
- let (mut arms, brace) = res;
+ let (arms, brace) = res;
ExprMatch {
expr: Box::new(obj),
match_token: match_,
brace_token: brace,
- arms: {
- for arm in &mut arms {
- if arm_requires_comma(arm) {
- arm.comma = Some(tokens::Comma::default());
- }
- }
- arms
- },
+ arms: arms,
}
})
));
@@ -1513,15 +1503,15 @@
pats: call!(Delimited::parse_separated_nonempty) >>
guard: option!(tuple!(syn!(If), syn!(Expr))) >>
rocket: syn!(Rocket) >>
- body: alt!(
- map!(syn!(Block), |blk| {
- ExprKind::Block(ExprBlock {
- unsafety: Unsafety::Normal,
- block: blk,
- }).into()
- })
- |
- syn!(Expr)
+ body: do_parse!(
+ expr: alt!(expr_nosemi | syn!(Expr)) >>
+ comma1: cond!(arm_expr_requires_comma(&expr), alt!(
+ map!(input_end!(), |_| None)
+ |
+ map!(syn!(Comma), Some)
+ )) >>
+ comma2: cond!(!arm_expr_requires_comma(&expr), option!(syn!(Comma))) >>
+ (expr, comma1.and_then(|x| x).or(comma2.and_then(|x| x)))
) >>
(Arm {
rocket_token: rocket,
@@ -1529,8 +1519,8 @@
attrs: attrs,
pats: pats,
guard: guard.map(|p| Box::new(p.1)),
- body: Box::new(body),
- comma: None,
+ body: Box::new(body.0),
+ comma: body.1,
})
));
}
@@ -2534,7 +2524,7 @@
// Ensure that we have a comma after a non-block arm, except
// for the last one.
let is_last = i == self.arms.len() - 1;
- if !is_last && arm_requires_comma(arm) && arm.comma.is_none() {
+ if !is_last && arm_expr_requires_comma(&arm.body) && arm.comma.is_none() {
tokens::Comma::default().to_tokens(tokens);
}
}