Parse range patterns in struct and slice without trailing comma

This commit is contained in:
Ryo Yoshida 2022-08-05 20:01:50 +09:00
parent 1c03f45c08
commit a81c7a2974
No known key found for this signature in database
GPG key ID: E25698A930586171
3 changed files with 150 additions and 3 deletions

View file

@ -75,6 +75,16 @@ fn pattern_single_r(p: &mut Parser<'_>, recovery_set: TokenSet) {
// Some(1..) => () // Some(1..) => ()
// } // }
// //
// match () {
// S { a: 0 } => (),
// S { a: 1.. } => (),
// }
//
// match () {
// [0] => (),
// [1..] => (),
// }
//
// match (10 as u8, 5 as u8) { // match (10 as u8, 5 as u8) {
// (0, _) => (), // (0, _) => (),
// (1.., _) => () // (1.., _) => ()
@ -88,9 +98,20 @@ fn pattern_single_r(p: &mut Parser<'_>, recovery_set: TokenSet) {
let m = lhs.precede(p); let m = lhs.precede(p);
p.bump(range_op); p.bump(range_op);
// `0 .. =>` or `let 0 .. =` or `Some(0 .. )` // testing if we're at one of the following positions:
// ^ ^ ^ // `0 .. =>`
if p.at(T![=]) | p.at(T![')']) | p.at(T![,]) { // ^
// `let 0 .. =`
// ^
// (1.., _)
// ^
// `Some(0 .. )`
// ^
// `S { t: 0.. }`
// ^
// `[0..]`
// ^
if p.at(T![=]) | p.at(T![')']) | p.at(T![,]) | p.at(T!['}']) | p.at(T![']']) {
// test half_open_range_pat // test half_open_range_pat
// fn f() { let 0 .. = 1u32; } // fn f() { let 0 .. = 1u32; }
} else { } else {

View file

@ -172,6 +172,122 @@ SOURCE_FILE
WHITESPACE "\n " WHITESPACE "\n "
R_CURLY "}" R_CURLY "}"
WHITESPACE "\n\n " WHITESPACE "\n\n "
EXPR_STMT
MATCH_EXPR
MATCH_KW "match"
WHITESPACE " "
TUPLE_EXPR
L_PAREN "("
R_PAREN ")"
WHITESPACE " "
MATCH_ARM_LIST
L_CURLY "{"
WHITESPACE "\n "
MATCH_ARM
RECORD_PAT
PATH
PATH_SEGMENT
NAME_REF
IDENT "S"
WHITESPACE " "
RECORD_PAT_FIELD_LIST
L_CURLY "{"
WHITESPACE " "
RECORD_PAT_FIELD
NAME_REF
IDENT "a"
COLON ":"
WHITESPACE " "
LITERAL_PAT
LITERAL
INT_NUMBER "0"
WHITESPACE " "
R_CURLY "}"
WHITESPACE " "
FAT_ARROW "=>"
WHITESPACE " "
TUPLE_EXPR
L_PAREN "("
R_PAREN ")"
COMMA ","
WHITESPACE "\n "
MATCH_ARM
RECORD_PAT
PATH
PATH_SEGMENT
NAME_REF
IDENT "S"
WHITESPACE " "
RECORD_PAT_FIELD_LIST
L_CURLY "{"
WHITESPACE " "
RECORD_PAT_FIELD
NAME_REF
IDENT "a"
COLON ":"
WHITESPACE " "
RANGE_PAT
LITERAL_PAT
LITERAL
INT_NUMBER "1"
DOT2 ".."
WHITESPACE " "
R_CURLY "}"
WHITESPACE " "
FAT_ARROW "=>"
WHITESPACE " "
TUPLE_EXPR
L_PAREN "("
R_PAREN ")"
COMMA ","
WHITESPACE "\n "
R_CURLY "}"
WHITESPACE "\n\n "
EXPR_STMT
MATCH_EXPR
MATCH_KW "match"
WHITESPACE " "
TUPLE_EXPR
L_PAREN "("
R_PAREN ")"
WHITESPACE " "
MATCH_ARM_LIST
L_CURLY "{"
WHITESPACE "\n "
MATCH_ARM
SLICE_PAT
L_BRACK "["
LITERAL_PAT
LITERAL
INT_NUMBER "0"
R_BRACK "]"
WHITESPACE " "
FAT_ARROW "=>"
WHITESPACE " "
TUPLE_EXPR
L_PAREN "("
R_PAREN ")"
COMMA ","
WHITESPACE "\n "
MATCH_ARM
SLICE_PAT
L_BRACK "["
RANGE_PAT
LITERAL_PAT
LITERAL
INT_NUMBER "1"
DOT2 ".."
R_BRACK "]"
WHITESPACE " "
FAT_ARROW "=>"
WHITESPACE " "
TUPLE_EXPR
L_PAREN "("
R_PAREN ")"
COMMA ","
WHITESPACE "\n "
R_CURLY "}"
WHITESPACE "\n\n "
MATCH_EXPR MATCH_EXPR
MATCH_KW "match" MATCH_KW "match"
WHITESPACE " " WHITESPACE " "

View file

@ -11,6 +11,16 @@ fn main() {
Some(1..) => () Some(1..) => ()
} }
match () {
S { a: 0 } => (),
S { a: 1.. } => (),
}
match () {
[0] => (),
[1..] => (),
}
match (10 as u8, 5 as u8) { match (10 as u8, 5 as u8) {
(0, _) => (), (0, _) => (),
(1.., _) => () (1.., _) => ()