aboutsummaryrefslogtreecommitdiff
path: root/src/grammar/expressions/atom.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/grammar/expressions/atom.rs')
-rw-r--r--src/grammar/expressions/atom.rs24
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// }
244fn match_arm(p: &mut Parser) { 253fn 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);