diff options
Diffstat (limited to 'src/grammar/expressions/atom.rs')
-rw-r--r-- | src/grammar/expressions/atom.rs | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/grammar/expressions/atom.rs b/src/grammar/expressions/atom.rs index e4f681c17..524a69a8c 100644 --- a/src/grammar/expressions/atom.rs +++ b/src/grammar/expressions/atom.rs | |||
@@ -133,7 +133,7 @@ fn lambda_expr(p: &mut Parser) -> CompletedMarker { | |||
133 | if fn_ret_type(p) { | 133 | if fn_ret_type(p) { |
134 | block(p); | 134 | block(p); |
135 | } else { | 135 | } else { |
136 | expr(p) | 136 | expr(p); |
137 | } | 137 | } |
138 | m.complete(p, LAMBDA_EXPR) | 138 | m.complete(p, LAMBDA_EXPR) |
139 | } | 139 | } |
@@ -225,8 +225,17 @@ fn match_expr(p: &mut Parser) -> CompletedMarker { | |||
225 | expr_no_struct(p); | 225 | expr_no_struct(p); |
226 | p.eat(L_CURLY); | 226 | p.eat(L_CURLY); |
227 | while !p.at(EOF) && !p.at(R_CURLY) { | 227 | while !p.at(EOF) && !p.at(R_CURLY) { |
228 | match_arm(p); | 228 | // test match_arms_commas |
229 | if !p.at(R_CURLY) { | 229 | // fn foo() { |
230 | // match () { | ||
231 | // _ => (), | ||
232 | // _ => {} | ||
233 | // _ => () | ||
234 | // } | ||
235 | // } | ||
236 | if match_arm(p).is_block() { | ||
237 | p.eat(COMMA); | ||
238 | } else if !p.at(R_CURLY) { | ||
230 | p.expect(COMMA); | 239 | p.expect(COMMA); |
231 | } | 240 | } |
232 | } | 241 | } |
@@ -241,7 +250,7 @@ fn match_expr(p: &mut Parser) -> CompletedMarker { | |||
241 | // X | Y if Z => (), | 250 | // X | Y if Z => (), |
242 | // }; | 251 | // }; |
243 | // } | 252 | // } |
244 | fn match_arm(p: &mut Parser) { | 253 | fn match_arm(p: &mut Parser) -> BlockLike { |
245 | let m = p.start(); | 254 | let m = p.start(); |
246 | loop { | 255 | loop { |
247 | patterns::pattern(p); | 256 | patterns::pattern(p); |
@@ -253,8 +262,9 @@ fn match_arm(p: &mut Parser) { | |||
253 | expr_no_struct(p); | 262 | expr_no_struct(p); |
254 | } | 263 | } |
255 | p.expect(FAT_ARROW); | 264 | p.expect(FAT_ARROW); |
256 | expr(p); | 265 | let ret = expr(p); |
257 | m.complete(p, MATCH_ARM); | 266 | m.complete(p, MATCH_ARM); |
267 | ret | ||
258 | } | 268 | } |
259 | 269 | ||
260 | // test block_expr | 270 | // test block_expr |
@@ -285,8 +295,8 @@ pub(super) fn block_expr(p: &mut Parser) -> CompletedMarker { | |||
285 | // test pub_expr | 295 | // test pub_expr |
286 | // fn foo() { pub 92; } //FIXME | 296 | // fn foo() { pub 92; } //FIXME |
287 | items::MaybeItem::None => { | 297 | items::MaybeItem::None => { |
288 | expressions::expr(p); | 298 | let is_blocklike = expressions::expr(p) == BlockLike::Block; |
289 | if p.eat(SEMI) { | 299 | if p.eat(SEMI) || (is_blocklike && !p.at(R_CURLY)) { |
290 | m.complete(p, EXPR_STMT); | 300 | m.complete(p, EXPR_STMT); |
291 | } else { | 301 | } else { |
292 | m.abandon(p); | 302 | m.abandon(p); |