From 719710a13256a32b9fcbf06c1ff43f8961b9b2e6 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 24 Aug 2018 11:21:13 +0300 Subject: [PATCH] break&continue --- crates/libsyntax2/src/grammar.ron | 4 ++ .../src/grammar/expressions/atom.rs | 39 +++++++++++++- .../libsyntax2/src/syntax_kinds/generated.rs | 12 +++++ .../data/parser/err/0012_broken_lambda.rs | 12 ----- .../data/parser/inline/0105_continue_expr.rs | 6 +++ .../data/parser/inline/0105_continue_expr.txt | 35 ++++++++++++ .../data/parser/inline/0106_break_expr.rs | 8 +++ .../data/parser/inline/0106_break_expr.txt | 53 +++++++++++++++++++ 8 files changed, 156 insertions(+), 13 deletions(-) delete mode 100644 crates/libsyntax2/tests/data/parser/err/0012_broken_lambda.rs create mode 100644 crates/libsyntax2/tests/data/parser/inline/0105_continue_expr.rs create mode 100644 crates/libsyntax2/tests/data/parser/inline/0105_continue_expr.txt create mode 100644 crates/libsyntax2/tests/data/parser/inline/0106_break_expr.rs create mode 100644 crates/libsyntax2/tests/data/parser/inline/0106_break_expr.txt diff --git a/crates/libsyntax2/src/grammar.ron b/crates/libsyntax2/src/grammar.ron index 2cec5b3e336..dff88cc4a0c 100644 --- a/crates/libsyntax2/src/grammar.ron +++ b/crates/libsyntax2/src/grammar.ron @@ -75,6 +75,8 @@ Grammar( "for", "loop", "while", + "continue", + "break", "if", "else", "match", @@ -161,6 +163,8 @@ Grammar( "IF_EXPR", "WHILE_EXPR", "LOOP_EXPR", + "CONTINUE_EXPR", + "BREAK_EXPR", "FOR_EXPR", "BLOCK_EXPR", "RETURN_EXPR", diff --git a/crates/libsyntax2/src/grammar/expressions/atom.rs b/crates/libsyntax2/src/grammar/expressions/atom.rs index 57a887f8444..9f470d5618b 100644 --- a/crates/libsyntax2/src/grammar/expressions/atom.rs +++ b/crates/libsyntax2/src/grammar/expressions/atom.rs @@ -30,7 +30,7 @@ pub(super) const ATOM_EXPR_FIRST: TokenSet = token_set_union![ LITERAL_FIRST, token_set![L_PAREN, PIPE, MOVE_KW, IF_KW, WHILE_KW, MATCH_KW, UNSAFE_KW, L_CURLY, RETURN_KW, - IDENT, SELF_KW, SUPER_KW, COLONCOLON ], + IDENT, SELF_KW, SUPER_KW, COLONCOLON, BREAK_KW, CONTINUE_KW ], ]; pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option { @@ -55,6 +55,8 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option block_expr(p), L_CURLY => block_expr(p), RETURN_KW => return_expr(p), + CONTINUE_KW => continue_expr(p), + BREAK_KW => break_expr(p), _ => { p.err_and_bump("expected expression"); return None; @@ -346,3 +348,38 @@ fn return_expr(p: &mut Parser) -> CompletedMarker { } m.complete(p, RETURN_EXPR) } + +// test continue_expr +// fn foo() { +// loop { +// continue; +// continue 'l; +// } +// } +fn continue_expr(p: &mut Parser) -> CompletedMarker { + assert!(p.at(CONTINUE_KW)); + let m = p.start(); + p.bump(); + p.eat(LIFETIME); + m.complete(p, CONTINUE_EXPR) +} + +// test break_expr +// fn foo() { +// loop { +// break; +// break 'l; +// break 92; +// break 'l 92; +// } +// } +fn break_expr(p: &mut Parser) -> CompletedMarker { + assert!(p.at(BREAK_KW)); + let m = p.start(); + p.bump(); + p.eat(LIFETIME); + if EXPR_FIRST.contains(p.current()) { + expr(p); + } + m.complete(p, BREAK_EXPR) +} diff --git a/crates/libsyntax2/src/syntax_kinds/generated.rs b/crates/libsyntax2/src/syntax_kinds/generated.rs index fc387c93d4e..82b6c89cf72 100644 --- a/crates/libsyntax2/src/syntax_kinds/generated.rs +++ b/crates/libsyntax2/src/syntax_kinds/generated.rs @@ -82,6 +82,8 @@ pub enum SyntaxKind { FOR_KW, LOOP_KW, WHILE_KW, + CONTINUE_KW, + BREAK_KW, IF_KW, ELSE_KW, MATCH_KW, @@ -157,6 +159,8 @@ pub enum SyntaxKind { IF_EXPR, WHILE_EXPR, LOOP_EXPR, + CONTINUE_EXPR, + BREAK_EXPR, FOR_EXPR, BLOCK_EXPR, RETURN_EXPR, @@ -232,6 +236,8 @@ impl SyntaxKind { | FOR_KW | LOOP_KW | WHILE_KW + | CONTINUE_KW + | BREAK_KW | IF_KW | ELSE_KW | MATCH_KW @@ -325,6 +331,8 @@ impl SyntaxKind { FOR_KW => &SyntaxInfo { name: "FOR_KW" }, LOOP_KW => &SyntaxInfo { name: "LOOP_KW" }, WHILE_KW => &SyntaxInfo { name: "WHILE_KW" }, + CONTINUE_KW => &SyntaxInfo { name: "CONTINUE_KW" }, + BREAK_KW => &SyntaxInfo { name: "BREAK_KW" }, IF_KW => &SyntaxInfo { name: "IF_KW" }, ELSE_KW => &SyntaxInfo { name: "ELSE_KW" }, MATCH_KW => &SyntaxInfo { name: "MATCH_KW" }, @@ -400,6 +408,8 @@ impl SyntaxKind { IF_EXPR => &SyntaxInfo { name: "IF_EXPR" }, WHILE_EXPR => &SyntaxInfo { name: "WHILE_EXPR" }, LOOP_EXPR => &SyntaxInfo { name: "LOOP_EXPR" }, + CONTINUE_EXPR => &SyntaxInfo { name: "CONTINUE_EXPR" }, + BREAK_EXPR => &SyntaxInfo { name: "BREAK_EXPR" }, FOR_EXPR => &SyntaxInfo { name: "FOR_EXPR" }, BLOCK_EXPR => &SyntaxInfo { name: "BLOCK_EXPR" }, RETURN_EXPR => &SyntaxInfo { name: "RETURN_EXPR" }, @@ -475,6 +485,8 @@ impl SyntaxKind { "for" => FOR_KW, "loop" => LOOP_KW, "while" => WHILE_KW, + "continue" => CONTINUE_KW, + "break" => BREAK_KW, "if" => IF_KW, "else" => ELSE_KW, "match" => MATCH_KW, diff --git a/crates/libsyntax2/tests/data/parser/err/0012_broken_lambda.rs b/crates/libsyntax2/tests/data/parser/err/0012_broken_lambda.rs deleted file mode 100644 index ad0d8eb4c40..00000000000 --- a/crates/libsyntax2/tests/data/parser/err/0012_broken_lambda.rs +++ /dev/null @@ -1,12 +0,0 @@ -pub(super) fn process<'a, S: Sink<'a>>(builder: &mut S, tokens: &[Token], events: Vec) { - let mut next_tok_idx = 0; - let eat_ws = |idx: &mut usize, &mut | { - while let Some(token) = tokens.get(*idx) { - if !token.kind.is_trivia() { - break; - } - builder.leaf(token.kind, token.len); - *idx += 1 - } - }; -} diff --git a/crates/libsyntax2/tests/data/parser/inline/0105_continue_expr.rs b/crates/libsyntax2/tests/data/parser/inline/0105_continue_expr.rs new file mode 100644 index 00000000000..474cc3f0e0c --- /dev/null +++ b/crates/libsyntax2/tests/data/parser/inline/0105_continue_expr.rs @@ -0,0 +1,6 @@ +fn foo() { + loop { + continue; + continue 'l; + } +} diff --git a/crates/libsyntax2/tests/data/parser/inline/0105_continue_expr.txt b/crates/libsyntax2/tests/data/parser/inline/0105_continue_expr.txt new file mode 100644 index 00000000000..05526fda64c --- /dev/null +++ b/crates/libsyntax2/tests/data/parser/inline/0105_continue_expr.txt @@ -0,0 +1,35 @@ +FILE@[0; 69) + FN_DEF@[0; 68) + FN_KW@[0; 2) + WHITESPACE@[2; 3) + NAME@[3; 6) + IDENT@[3; 6) "foo" + PARAM_LIST@[6; 8) + L_PAREN@[6; 7) + R_PAREN@[7; 8) + WHITESPACE@[8; 9) + BLOCK_EXPR@[9; 68) + L_CURLY@[9; 10) + WHITESPACE@[10; 15) + LOOP_EXPR@[15; 66) + LOOP_KW@[15; 19) + WHITESPACE@[19; 20) + BLOCK_EXPR@[20; 66) + L_CURLY@[20; 21) + WHITESPACE@[21; 30) + EXPR_STMT@[30; 39) + CONTINUE_EXPR@[30; 38) + CONTINUE_KW@[30; 38) + SEMI@[38; 39) + WHITESPACE@[39; 48) + EXPR_STMT@[48; 60) + CONTINUE_EXPR@[48; 59) + CONTINUE_KW@[48; 56) + WHITESPACE@[56; 57) + LIFETIME@[57; 59) "'l" + SEMI@[59; 60) + WHITESPACE@[60; 65) + R_CURLY@[65; 66) + WHITESPACE@[66; 67) + R_CURLY@[67; 68) + WHITESPACE@[68; 69) diff --git a/crates/libsyntax2/tests/data/parser/inline/0106_break_expr.rs b/crates/libsyntax2/tests/data/parser/inline/0106_break_expr.rs new file mode 100644 index 00000000000..1b40946365f --- /dev/null +++ b/crates/libsyntax2/tests/data/parser/inline/0106_break_expr.rs @@ -0,0 +1,8 @@ +fn foo() { + loop { + break; + break 'l; + break 92; + break 'l 92; + } +} diff --git a/crates/libsyntax2/tests/data/parser/inline/0106_break_expr.txt b/crates/libsyntax2/tests/data/parser/inline/0106_break_expr.txt new file mode 100644 index 00000000000..bb490e44179 --- /dev/null +++ b/crates/libsyntax2/tests/data/parser/inline/0106_break_expr.txt @@ -0,0 +1,53 @@ +FILE@[0; 102) + FN_DEF@[0; 101) + FN_KW@[0; 2) + WHITESPACE@[2; 3) + NAME@[3; 6) + IDENT@[3; 6) "foo" + PARAM_LIST@[6; 8) + L_PAREN@[6; 7) + R_PAREN@[7; 8) + WHITESPACE@[8; 9) + BLOCK_EXPR@[9; 101) + L_CURLY@[9; 10) + WHITESPACE@[10; 15) + LOOP_EXPR@[15; 99) + LOOP_KW@[15; 19) + WHITESPACE@[19; 20) + BLOCK_EXPR@[20; 99) + L_CURLY@[20; 21) + WHITESPACE@[21; 30) + EXPR_STMT@[30; 36) + BREAK_EXPR@[30; 35) + BREAK_KW@[30; 35) + SEMI@[35; 36) + WHITESPACE@[36; 45) + EXPR_STMT@[45; 54) + BREAK_EXPR@[45; 53) + BREAK_KW@[45; 50) + WHITESPACE@[50; 51) + LIFETIME@[51; 53) "'l" + SEMI@[53; 54) + WHITESPACE@[54; 63) + EXPR_STMT@[63; 72) + BREAK_EXPR@[63; 71) + BREAK_KW@[63; 68) + WHITESPACE@[68; 69) + LITERAL@[69; 71) + INT_NUMBER@[69; 71) "92" + SEMI@[71; 72) + WHITESPACE@[72; 81) + EXPR_STMT@[81; 93) + BREAK_EXPR@[81; 92) + BREAK_KW@[81; 86) + WHITESPACE@[86; 87) + LIFETIME@[87; 89) "'l" + WHITESPACE@[89; 90) + LITERAL@[90; 92) + INT_NUMBER@[90; 92) "92" + SEMI@[92; 93) + WHITESPACE@[93; 98) + R_CURLY@[98; 99) + WHITESPACE@[99; 100) + R_CURLY@[100; 101) + WHITESPACE@[101; 102)