From 1f4468a8dae10db4f500bde3c1708228de6137b6 Mon Sep 17 00:00:00 2001 From: Ville Penttinen Date: Mon, 4 Mar 2019 19:10:14 +0200 Subject: [PATCH] Add support for parsing multiple if and while-let patterns --- .../ra_parser/src/grammar/expressions/atom.rs | 10 ++ .../tests/data/parser/inline/ok/0030_cond.rs | 6 + .../tests/data/parser/inline/ok/0030_cond.txt | 159 +++++++++++++++++- 3 files changed, 174 insertions(+), 1 deletion(-) diff --git a/crates/ra_parser/src/grammar/expressions/atom.rs b/crates/ra_parser/src/grammar/expressions/atom.rs index e74305b6a94..dfa3916323e 100644 --- a/crates/ra_parser/src/grammar/expressions/atom.rs +++ b/crates/ra_parser/src/grammar/expressions/atom.rs @@ -281,10 +281,20 @@ fn for_expr(p: &mut Parser, m: Option) -> 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) { + p.eat(PIPE); patterns::pattern(p); + while p.eat(PIPE) { + patterns::pattern(p); + } p.expect(EQ); } expr_no_struct(p); diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0030_cond.rs b/crates/ra_syntax/tests/data/parser/inline/ok/0030_cond.rs index fdb37ee6f33..2552a2621f9 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0030_cond.rs +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0030_cond.rs @@ -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 {} +} diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0030_cond.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0030_cond.txt index 641a09fff5f..6dea1848b42 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0030_cond.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0030_cond.txt @@ -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)