mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
Merge #930
930: Add support for parsing multiple if and while-let patterns r=matklad a=vipentti Co-authored-by: Ville Penttinen <villem.penttinen@gmail.com>
This commit is contained in:
commit
e7241274ef
4 changed files with 188 additions and 7 deletions
|
@ -281,10 +281,16 @@ fn for_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
|
|||
|
||||
// test cond
|
||||
// fn foo() { if let Some(_) = None {} }
|
||||
// fn bar() {
|
||||
// if let Some(_) | Some(_) = None {}
|
||||
// if let | Some(_) = None {}
|
||||
// while let Some(_) | Some(_) = None {}
|
||||
// while let | Some(_) = None {}
|
||||
// }
|
||||
fn cond(p: &mut Parser) {
|
||||
let m = p.start();
|
||||
if p.eat(LET_KW) {
|
||||
patterns::pattern(p);
|
||||
patterns::pattern_list(p);
|
||||
p.expect(EQ);
|
||||
}
|
||||
expr_no_struct(p);
|
||||
|
@ -376,11 +382,7 @@ pub(crate) fn match_arm_list(p: &mut Parser) {
|
|||
// }
|
||||
fn match_arm(p: &mut Parser) -> BlockLike {
|
||||
let m = p.start();
|
||||
p.eat(PIPE);
|
||||
patterns::pattern_r(p, TokenSet::empty());
|
||||
while p.eat(PIPE) {
|
||||
patterns::pattern(p);
|
||||
}
|
||||
patterns::pattern_list_r(p, TokenSet::empty());
|
||||
if p.at(IF_KW) {
|
||||
match_guard(p);
|
||||
}
|
||||
|
|
|
@ -8,6 +8,22 @@ pub(super) fn pattern(p: &mut Parser) {
|
|||
pattern_r(p, PAT_RECOVERY_SET)
|
||||
}
|
||||
|
||||
/// Parses a pattern list separated by pipes `|`
|
||||
pub(super) fn pattern_list(p: &mut Parser) {
|
||||
pattern_list_r(p, PAT_RECOVERY_SET)
|
||||
}
|
||||
|
||||
/// Parses a pattern list separated by pipes `|`
|
||||
/// using the given `recovery_set`
|
||||
pub(super) fn pattern_list_r(p: &mut Parser, recovery_set: TokenSet) {
|
||||
p.eat(PIPE);
|
||||
pattern_r(p, recovery_set);
|
||||
|
||||
while p.eat(PIPE) {
|
||||
pattern_r(p, recovery_set);
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn pattern_r(p: &mut Parser, recovery_set: TokenSet) {
|
||||
if let Some(lhs) = atom_pat(p, recovery_set) {
|
||||
// test range_pat
|
||||
|
|
|
@ -1 +1,7 @@
|
|||
fn foo() { if let Some(_) = None {} }
|
||||
fn bar() {
|
||||
if let Some(_) | Some(_) = None {}
|
||||
if let | Some(_) = None {}
|
||||
while let Some(_) | Some(_) = None {}
|
||||
while let | Some(_) = None {}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
SOURCE_FILE@[0; 38)
|
||||
SOURCE_FILE@[0; 197)
|
||||
FN_DEF@[0; 37)
|
||||
FN_KW@[0; 2)
|
||||
WHITESPACE@[2; 3)
|
||||
|
@ -41,3 +41,160 @@ SOURCE_FILE@[0; 38)
|
|||
WHITESPACE@[35; 36)
|
||||
R_CURLY@[36; 37)
|
||||
WHITESPACE@[37; 38)
|
||||
FN_DEF@[38; 196)
|
||||
FN_KW@[38; 40)
|
||||
WHITESPACE@[40; 41)
|
||||
NAME@[41; 44)
|
||||
IDENT@[41; 44) "bar"
|
||||
PARAM_LIST@[44; 46)
|
||||
L_PAREN@[44; 45)
|
||||
R_PAREN@[45; 46)
|
||||
WHITESPACE@[46; 47)
|
||||
BLOCK@[47; 196)
|
||||
L_CURLY@[47; 48)
|
||||
WHITESPACE@[48; 53)
|
||||
EXPR_STMT@[53; 87)
|
||||
IF_EXPR@[53; 87)
|
||||
IF_KW@[53; 55)
|
||||
WHITESPACE@[55; 56)
|
||||
CONDITION@[56; 84)
|
||||
LET_KW@[56; 59)
|
||||
WHITESPACE@[59; 60)
|
||||
TUPLE_STRUCT_PAT@[60; 67)
|
||||
PATH@[60; 64)
|
||||
PATH_SEGMENT@[60; 64)
|
||||
NAME_REF@[60; 64)
|
||||
IDENT@[60; 64) "Some"
|
||||
L_PAREN@[64; 65)
|
||||
PLACEHOLDER_PAT@[65; 66)
|
||||
UNDERSCORE@[65; 66)
|
||||
R_PAREN@[66; 67)
|
||||
WHITESPACE@[67; 68)
|
||||
PIPE@[68; 69)
|
||||
WHITESPACE@[69; 70)
|
||||
TUPLE_STRUCT_PAT@[70; 77)
|
||||
PATH@[70; 74)
|
||||
PATH_SEGMENT@[70; 74)
|
||||
NAME_REF@[70; 74)
|
||||
IDENT@[70; 74) "Some"
|
||||
L_PAREN@[74; 75)
|
||||
PLACEHOLDER_PAT@[75; 76)
|
||||
UNDERSCORE@[75; 76)
|
||||
R_PAREN@[76; 77)
|
||||
WHITESPACE@[77; 78)
|
||||
EQ@[78; 79)
|
||||
WHITESPACE@[79; 80)
|
||||
PATH_EXPR@[80; 84)
|
||||
PATH@[80; 84)
|
||||
PATH_SEGMENT@[80; 84)
|
||||
NAME_REF@[80; 84)
|
||||
IDENT@[80; 84) "None"
|
||||
WHITESPACE@[84; 85)
|
||||
BLOCK@[85; 87)
|
||||
L_CURLY@[85; 86)
|
||||
R_CURLY@[86; 87)
|
||||
WHITESPACE@[87; 92)
|
||||
EXPR_STMT@[92; 118)
|
||||
IF_EXPR@[92; 118)
|
||||
IF_KW@[92; 94)
|
||||
WHITESPACE@[94; 95)
|
||||
CONDITION@[95; 115)
|
||||
LET_KW@[95; 98)
|
||||
WHITESPACE@[98; 99)
|
||||
PIPE@[99; 100)
|
||||
WHITESPACE@[100; 101)
|
||||
TUPLE_STRUCT_PAT@[101; 108)
|
||||
PATH@[101; 105)
|
||||
PATH_SEGMENT@[101; 105)
|
||||
NAME_REF@[101; 105)
|
||||
IDENT@[101; 105) "Some"
|
||||
L_PAREN@[105; 106)
|
||||
PLACEHOLDER_PAT@[106; 107)
|
||||
UNDERSCORE@[106; 107)
|
||||
R_PAREN@[107; 108)
|
||||
WHITESPACE@[108; 109)
|
||||
EQ@[109; 110)
|
||||
WHITESPACE@[110; 111)
|
||||
PATH_EXPR@[111; 115)
|
||||
PATH@[111; 115)
|
||||
PATH_SEGMENT@[111; 115)
|
||||
NAME_REF@[111; 115)
|
||||
IDENT@[111; 115) "None"
|
||||
WHITESPACE@[115; 116)
|
||||
BLOCK@[116; 118)
|
||||
L_CURLY@[116; 117)
|
||||
R_CURLY@[117; 118)
|
||||
WHITESPACE@[118; 123)
|
||||
EXPR_STMT@[123; 160)
|
||||
WHILE_EXPR@[123; 160)
|
||||
WHILE_KW@[123; 128)
|
||||
WHITESPACE@[128; 129)
|
||||
CONDITION@[129; 157)
|
||||
LET_KW@[129; 132)
|
||||
WHITESPACE@[132; 133)
|
||||
TUPLE_STRUCT_PAT@[133; 140)
|
||||
PATH@[133; 137)
|
||||
PATH_SEGMENT@[133; 137)
|
||||
NAME_REF@[133; 137)
|
||||
IDENT@[133; 137) "Some"
|
||||
L_PAREN@[137; 138)
|
||||
PLACEHOLDER_PAT@[138; 139)
|
||||
UNDERSCORE@[138; 139)
|
||||
R_PAREN@[139; 140)
|
||||
WHITESPACE@[140; 141)
|
||||
PIPE@[141; 142)
|
||||
WHITESPACE@[142; 143)
|
||||
TUPLE_STRUCT_PAT@[143; 150)
|
||||
PATH@[143; 147)
|
||||
PATH_SEGMENT@[143; 147)
|
||||
NAME_REF@[143; 147)
|
||||
IDENT@[143; 147) "Some"
|
||||
L_PAREN@[147; 148)
|
||||
PLACEHOLDER_PAT@[148; 149)
|
||||
UNDERSCORE@[148; 149)
|
||||
R_PAREN@[149; 150)
|
||||
WHITESPACE@[150; 151)
|
||||
EQ@[151; 152)
|
||||
WHITESPACE@[152; 153)
|
||||
PATH_EXPR@[153; 157)
|
||||
PATH@[153; 157)
|
||||
PATH_SEGMENT@[153; 157)
|
||||
NAME_REF@[153; 157)
|
||||
IDENT@[153; 157) "None"
|
||||
WHITESPACE@[157; 158)
|
||||
BLOCK@[158; 160)
|
||||
L_CURLY@[158; 159)
|
||||
R_CURLY@[159; 160)
|
||||
WHITESPACE@[160; 165)
|
||||
WHILE_EXPR@[165; 194)
|
||||
WHILE_KW@[165; 170)
|
||||
WHITESPACE@[170; 171)
|
||||
CONDITION@[171; 191)
|
||||
LET_KW@[171; 174)
|
||||
WHITESPACE@[174; 175)
|
||||
PIPE@[175; 176)
|
||||
WHITESPACE@[176; 177)
|
||||
TUPLE_STRUCT_PAT@[177; 184)
|
||||
PATH@[177; 181)
|
||||
PATH_SEGMENT@[177; 181)
|
||||
NAME_REF@[177; 181)
|
||||
IDENT@[177; 181) "Some"
|
||||
L_PAREN@[181; 182)
|
||||
PLACEHOLDER_PAT@[182; 183)
|
||||
UNDERSCORE@[182; 183)
|
||||
R_PAREN@[183; 184)
|
||||
WHITESPACE@[184; 185)
|
||||
EQ@[185; 186)
|
||||
WHITESPACE@[186; 187)
|
||||
PATH_EXPR@[187; 191)
|
||||
PATH@[187; 191)
|
||||
PATH_SEGMENT@[187; 191)
|
||||
NAME_REF@[187; 191)
|
||||
IDENT@[187; 191) "None"
|
||||
WHITESPACE@[191; 192)
|
||||
BLOCK@[192; 194)
|
||||
L_CURLY@[192; 193)
|
||||
R_CURLY@[193; 194)
|
||||
WHITESPACE@[194; 195)
|
||||
R_CURLY@[195; 196)
|
||||
WHITESPACE@[196; 197)
|
||||
|
|
Loading…
Reference in a new issue