break&continue
This commit is contained in:
parent
a66c94af1b
commit
719710a132
crates/libsyntax2
src
tests/data/parser
@ -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",
|
||||
|
@ -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<CompletedMarker> {
|
||||
@ -55,6 +55,8 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<CompletedMark
|
||||
UNSAFE_KW if la == L_CURLY => 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)
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -1,12 +0,0 @@
|
||||
pub(super) fn process<'a, S: Sink<'a>>(builder: &mut S, tokens: &[Token], events: Vec<Event>) {
|
||||
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
|
||||
}
|
||||
};
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
fn foo() {
|
||||
loop {
|
||||
continue;
|
||||
continue 'l;
|
||||
}
|
||||
}
|
@ -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)
|
@ -0,0 +1,8 @@
|
||||
fn foo() {
|
||||
loop {
|
||||
break;
|
||||
break 'l;
|
||||
break 92;
|
||||
break 'l 92;
|
||||
}
|
||||
}
|
@ -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)
|
Loading…
x
Reference in New Issue
Block a user