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:
bors[bot] 2019-03-05 10:28:24 +00:00
commit e7241274ef
4 changed files with 188 additions and 7 deletions

View file

@ -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);
}

View file

@ -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

View file

@ -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 {}
}

View file

@ -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)