aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/src/grammar/expressions/atom.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_syntax/src/grammar/expressions/atom.rs')
-rw-r--r--crates/ra_syntax/src/grammar/expressions/atom.rs20
1 files changed, 14 insertions, 6 deletions
diff --git a/crates/ra_syntax/src/grammar/expressions/atom.rs b/crates/ra_syntax/src/grammar/expressions/atom.rs
index cd7d62aff..31b09ac5b 100644
--- a/crates/ra_syntax/src/grammar/expressions/atom.rs
+++ b/crates/ra_syntax/src/grammar/expressions/atom.rs
@@ -35,11 +35,12 @@ pub(crate) fn literal(p: &mut Parser) -> Option<CompletedMarker> {
35 Some(m.complete(p, LITERAL)) 35 Some(m.complete(p, LITERAL))
36} 36}
37 37
38// E.g. for after the break in `if break {}`, this should not match
38pub(super) const ATOM_EXPR_FIRST: TokenSet = token_set_union![ 39pub(super) const ATOM_EXPR_FIRST: TokenSet = token_set_union![
39 LITERAL_FIRST, 40 LITERAL_FIRST,
40 token_set![ 41 token_set![
41 L_CURLY,
42 L_PAREN, 42 L_PAREN,
43 L_CURLY,
43 L_BRACK, 44 L_BRACK,
44 PIPE, 45 PIPE,
45 MOVE_KW, 46 MOVE_KW,
@@ -88,7 +89,7 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
88 WHILE_KW => while_expr(p, Some(m)), 89 WHILE_KW => while_expr(p, Some(m)),
89 L_CURLY => block_expr(p, Some(m)), 90 L_CURLY => block_expr(p, Some(m)),
90 _ => { 91 _ => {
91 // test misplaced_label_err 92 // test_err misplaced_label_err
92 // fn main() { 93 // fn main() {
93 // 'loop: impl 94 // 'loop: impl
94 // } 95 // }
@@ -108,7 +109,7 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
108 L_CURLY => block_expr(p, None), 109 L_CURLY => block_expr(p, None),
109 RETURN_KW => return_expr(p), 110 RETURN_KW => return_expr(p),
110 CONTINUE_KW => continue_expr(p), 111 CONTINUE_KW => continue_expr(p),
111 BREAK_KW => break_expr(p), 112 BREAK_KW => break_expr(p, r),
112 _ => { 113 _ => {
113 p.err_recover("expected expression", EXPR_RECOVERY_SET); 114 p.err_recover("expected expression", EXPR_RECOVERY_SET);
114 return None; 115 return None;
@@ -353,7 +354,7 @@ pub(crate) fn match_arm_list(p: &mut Parser) {
353// fn foo() { 354// fn foo() {
354// match () { 355// match () {
355// _ => (), 356// _ => (),
356// _ if Test>{field: 0} => (), 357// _ if Test > Test{field: 0} => (),
357// X | Y if Z => (), 358// X | Y if Z => (),
358// | X | Y if Z => (), 359// | X | Y if Z => (),
359// | X => (), 360// | X => (),
@@ -427,12 +428,19 @@ fn continue_expr(p: &mut Parser) -> CompletedMarker {
427// break 'l 92; 428// break 'l 92;
428// } 429// }
429// } 430// }
430fn break_expr(p: &mut Parser) -> CompletedMarker { 431fn break_expr(p: &mut Parser, r: Restrictions) -> CompletedMarker {
431 assert!(p.at(BREAK_KW)); 432 assert!(p.at(BREAK_KW));
432 let m = p.start(); 433 let m = p.start();
433 p.bump(); 434 p.bump();
434 p.eat(LIFETIME); 435 p.eat(LIFETIME);
435 if p.at_ts(EXPR_FIRST) { 436 // test break_ambiguity
437 // fn foo(){
438 // if break {}
439 // while break {}
440 // for i in break {}
441 // match break {}
442 // }
443 if p.at_ts(EXPR_FIRST) && !(r.forbid_structs && p.at(L_CURLY)) {
436 expr(p); 444 expr(p);
437 } 445 }
438 m.complete(p, BREAK_EXPR) 446 m.complete(p, BREAK_EXPR)