Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/parser/src/grammar/patterns.rs75
-rw-r--r--crates/parser/src/parser.rs2
-rw-r--r--crates/parser/test_data/parser/inline/ok/0058_range_pat.rast106
-rw-r--r--crates/parser/test_data/parser/inline/ok/0058_range_pat.rs9
4 files changed, 157 insertions, 35 deletions
diff --git a/crates/parser/src/grammar/patterns.rs b/crates/parser/src/grammar/patterns.rs
index bc1224af9b..633e3e0a0b 100644
--- a/crates/parser/src/grammar/patterns.rs
+++ b/crates/parser/src/grammar/patterns.rs
@@ -62,39 +62,50 @@ fn pattern_r(p: &mut Parser<'_>, recovery_set: TokenSet) {
}
fn pattern_single_r(p: &mut Parser<'_>, recovery_set: TokenSet) {
- if let Some(lhs) = atom_pat(p, recovery_set) {
- // test range_pat
- // fn main() {
- // match 92 {
- // 0 ... 100 => (),
- // 101 ..= 200 => (),
- // 200 .. 301 => (),
- // 302 .. => (),
- // }
- //
- // match Some(10 as u8) {
- // Some(0) | None => (),
- // Some(1..) => ()
- // }
- //
- // match () {
- // S { a: 0 } => (),
- // S { a: 1.. } => (),
- // }
- //
- // match () {
- // [0] => (),
- // [1..] => (),
- // }
- //
- // match (10 as u8, 5 as u8) {
- // (0, _) => (),
- // (1.., _) => ()
- // }
- // }
+ // test range_pat
+ // fn main() {
+ // match 92 {
+ // 0 ... 100 => (),
+ // 101 ..= 200 => (),
+ // 200 .. 301 => (),
+ // 302 .. => (),
+ // ..= 303 => (),
+ // }
+ //
+ // match Some(10 as u8) {
+ // Some(0) | None => (),
+ // Some(1..) => (),
+ // Some(..=2) => (),
+ // }
+ //
+ // match () {
+ // S { a: 0 } => (),
+ // S { a: 1.. } => (),
+ // S { a: ..=2 } => (),
+ // }
+ //
+ // match () {
+ // [0] => (),
+ // [1..] => (),
+ // [..=2] => (),
+ // }
+ //
+ // match (10 as u8, 5 as u8) {
+ // (0, _) => (),
+ // (1.., _) => (),
+ // (..=2, _) => (),
+ // }
+ // }
+
+ if p.at(T![..=]) {
+ let m = p.start();
+ p.bump(T![..=]);
+ atom_pat(p, recovery_set);
+ m.complete(p, RANGE_PAT);
+ return;
+ }
- // FIXME: support half_open_range_patterns (`..=2`),
- // exclusive_range_pattern (`..5`) with missing lhs
+ if let Some(lhs) = atom_pat(p, recovery_set) {
for range_op in [T![...], T![..=], T![..]] {
if p.at(range_op) {
let m = lhs.precede(p);
diff --git a/crates/parser/src/parser.rs b/crates/parser/src/parser.rs
index 48d8350e07..33d645b048 100644
--- a/crates/parser/src/parser.rs
+++ b/crates/parser/src/parser.rs
@@ -162,7 +162,7 @@ impl<'t> Parser<'t> {
Marker::new(pos)
}
- /// Consume the next token if `kind` matches.
+ /// Consume the next token. Panics if the parser isn't currently at `kind`.
pub(crate) fn bump(&mut self, kind: SyntaxKind) {
assert!(self.eat(kind));
}
diff --git a/crates/parser/test_data/parser/inline/ok/0058_range_pat.rast b/crates/parser/test_data/parser/inline/ok/0058_range_pat.rast
index cfef5d3f95..d9981c5071 100644
--- a/crates/parser/test_data/parser/inline/ok/0058_range_pat.rast
+++ b/crates/parser/test_data/parser/inline/ok/0058_range_pat.rast
@@ -93,6 +93,21 @@ SOURCE_FILE
L_PAREN "("
R_PAREN ")"
COMMA ","
+ WHITESPACE "\n "
+ MATCH_ARM
+ RANGE_PAT
+ DOT2EQ "..="
+ WHITESPACE " "
+ LITERAL_PAT
+ LITERAL
+ INT_NUMBER "303"
+ WHITESPACE " "
+ FAT_ARROW "=>"
+ WHITESPACE " "
+ TUPLE_EXPR
+ L_PAREN "("
+ R_PAREN ")"
+ COMMA ","
WHITESPACE "\n "
R_CURLY "}"
WHITESPACE "\n\n "
@@ -169,6 +184,28 @@ SOURCE_FILE
TUPLE_EXPR
L_PAREN "("
R_PAREN ")"
+ COMMA ","
+ WHITESPACE "\n "
+ MATCH_ARM
+ TUPLE_STRUCT_PAT
+ PATH
+ PATH_SEGMENT
+ NAME_REF
+ IDENT "Some"
+ L_PAREN "("
+ RANGE_PAT
+ DOT2EQ "..="
+ LITERAL_PAT
+ LITERAL
+ INT_NUMBER "2"
+ R_PAREN ")"
+ WHITESPACE " "
+ FAT_ARROW "=>"
+ WHITESPACE " "
+ TUPLE_EXPR
+ L_PAREN "("
+ R_PAREN ")"
+ COMMA ","
WHITESPACE "\n "
R_CURLY "}"
WHITESPACE "\n\n "
@@ -240,6 +277,36 @@ SOURCE_FILE
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
+ DOT2EQ "..="
+ LITERAL_PAT
+ LITERAL
+ INT_NUMBER "2"
+ WHITESPACE " "
+ R_CURLY "}"
+ WHITESPACE " "
+ FAT_ARROW "=>"
+ WHITESPACE " "
+ TUPLE_EXPR
+ L_PAREN "("
+ R_PAREN ")"
+ COMMA ","
WHITESPACE "\n "
R_CURLY "}"
WHITESPACE "\n\n "
@@ -285,6 +352,23 @@ SOURCE_FILE
L_PAREN "("
R_PAREN ")"
COMMA ","
+ WHITESPACE "\n "
+ MATCH_ARM
+ SLICE_PAT
+ L_BRACK "["
+ RANGE_PAT
+ DOT2EQ "..="
+ LITERAL_PAT
+ LITERAL
+ INT_NUMBER "2"
+ R_BRACK "]"
+ WHITESPACE " "
+ FAT_ARROW "=>"
+ WHITESPACE " "
+ TUPLE_EXPR
+ L_PAREN "("
+ R_PAREN ")"
+ COMMA ","
WHITESPACE "\n "
R_CURLY "}"
WHITESPACE "\n\n "
@@ -360,6 +444,28 @@ SOURCE_FILE
TUPLE_EXPR
L_PAREN "("
R_PAREN ")"
+ COMMA ","
+ WHITESPACE "\n "
+ MATCH_ARM
+ TUPLE_PAT
+ L_PAREN "("
+ RANGE_PAT
+ DOT2EQ "..="
+ LITERAL_PAT
+ LITERAL
+ INT_NUMBER "2"
+ COMMA ","
+ WHITESPACE " "
+ WILDCARD_PAT
+ UNDERSCORE "_"
+ R_PAREN ")"
+ WHITESPACE " "
+ FAT_ARROW "=>"
+ WHITESPACE " "
+ TUPLE_EXPR
+ L_PAREN "("
+ R_PAREN ")"
+ COMMA ","
WHITESPACE "\n "
R_CURLY "}"
WHITESPACE "\n"
diff --git a/crates/parser/test_data/parser/inline/ok/0058_range_pat.rs b/crates/parser/test_data/parser/inline/ok/0058_range_pat.rs
index 2411d51096..b54354211d 100644
--- a/crates/parser/test_data/parser/inline/ok/0058_range_pat.rs
+++ b/crates/parser/test_data/parser/inline/ok/0058_range_pat.rs
@@ -4,25 +4,30 @@ fn main() {
101 ..= 200 => (),
200 .. 301 => (),
302 .. => (),
+ ..= 303 => (),
}
match Some(10 as u8) {
Some(0) | None => (),
- Some(1..) => ()
+ Some(1..) => (),
+ Some(..=2) => (),
}
match () {
S { a: 0 } => (),
S { a: 1.. } => (),
+ S { a: ..=2 } => (),
}
match () {
[0] => (),
[1..] => (),
+ [..=2] => (),
}
match (10 as u8, 5 as u8) {
(0, _) => (),
- (1.., _) => ()
+ (1.., _) => (),
+ (..=2, _) => (),
}
}