mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-15 09:27:27 +00:00
Auto merge of #13769 - jonas-schievink:parse-half-open-range-pat, r=jonas-schievink
feat: Parse half-open `..= X` patterns Closes https://github.com/rust-lang/rust-analyzer/issues/13739
This commit is contained in:
commit
fb4e9359d1
4 changed files with 157 additions and 35 deletions
|
@ -62,39 +62,50 @@ fn pattern_r(p: &mut Parser<'_>, recovery_set: TokenSet) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pattern_single_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
|
||||||
// test range_pat
|
// fn main() {
|
||||||
// fn main() {
|
// match 92 {
|
||||||
// match 92 {
|
// 0 ... 100 => (),
|
||||||
// 0 ... 100 => (),
|
// 101 ..= 200 => (),
|
||||||
// 101 ..= 200 => (),
|
// 200 .. 301 => (),
|
||||||
// 200 .. 301 => (),
|
// 302 .. => (),
|
||||||
// 302 .. => (),
|
// ..= 303 => (),
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// match Some(10 as u8) {
|
// match Some(10 as u8) {
|
||||||
// Some(0) | None => (),
|
// Some(0) | None => (),
|
||||||
// Some(1..) => ()
|
// Some(1..) => (),
|
||||||
// }
|
// Some(..=2) => (),
|
||||||
//
|
// }
|
||||||
// match () {
|
//
|
||||||
// S { a: 0 } => (),
|
// match () {
|
||||||
// S { a: 1.. } => (),
|
// S { a: 0 } => (),
|
||||||
// }
|
// S { a: 1.. } => (),
|
||||||
//
|
// S { a: ..=2 } => (),
|
||||||
// match () {
|
// }
|
||||||
// [0] => (),
|
//
|
||||||
// [1..] => (),
|
// match () {
|
||||||
// }
|
// [0] => (),
|
||||||
//
|
// [1..] => (),
|
||||||
// match (10 as u8, 5 as u8) {
|
// [..=2] => (),
|
||||||
// (0, _) => (),
|
// }
|
||||||
// (1.., _) => ()
|
//
|
||||||
// }
|
// match (10 as u8, 5 as u8) {
|
||||||
// }
|
// (0, _) => (),
|
||||||
|
// (1.., _) => (),
|
||||||
|
// (..=2, _) => (),
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
// FIXME: support half_open_range_patterns (`..=2`),
|
if p.at(T![..=]) {
|
||||||
// exclusive_range_pattern (`..5`) with missing lhs
|
let m = p.start();
|
||||||
|
p.bump(T![..=]);
|
||||||
|
atom_pat(p, recovery_set);
|
||||||
|
m.complete(p, RANGE_PAT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(lhs) = atom_pat(p, recovery_set) {
|
||||||
for range_op in [T![...], T![..=], T![..]] {
|
for range_op in [T![...], T![..=], T![..]] {
|
||||||
if p.at(range_op) {
|
if p.at(range_op) {
|
||||||
let m = lhs.precede(p);
|
let m = lhs.precede(p);
|
||||||
|
|
|
@ -162,7 +162,7 @@ impl<'t> Parser<'t> {
|
||||||
Marker::new(pos)
|
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) {
|
pub(crate) fn bump(&mut self, kind: SyntaxKind) {
|
||||||
assert!(self.eat(kind));
|
assert!(self.eat(kind));
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,6 +93,21 @@ SOURCE_FILE
|
||||||
L_PAREN "("
|
L_PAREN "("
|
||||||
R_PAREN ")"
|
R_PAREN ")"
|
||||||
COMMA ","
|
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 "
|
WHITESPACE "\n "
|
||||||
R_CURLY "}"
|
R_CURLY "}"
|
||||||
WHITESPACE "\n\n "
|
WHITESPACE "\n\n "
|
||||||
|
@ -169,6 +184,28 @@ SOURCE_FILE
|
||||||
TUPLE_EXPR
|
TUPLE_EXPR
|
||||||
L_PAREN "("
|
L_PAREN "("
|
||||||
R_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 "
|
WHITESPACE "\n "
|
||||||
R_CURLY "}"
|
R_CURLY "}"
|
||||||
WHITESPACE "\n\n "
|
WHITESPACE "\n\n "
|
||||||
|
@ -240,6 +277,36 @@ SOURCE_FILE
|
||||||
L_PAREN "("
|
L_PAREN "("
|
||||||
R_PAREN ")"
|
R_PAREN ")"
|
||||||
COMMA ","
|
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 "
|
WHITESPACE "\n "
|
||||||
R_CURLY "}"
|
R_CURLY "}"
|
||||||
WHITESPACE "\n\n "
|
WHITESPACE "\n\n "
|
||||||
|
@ -285,6 +352,23 @@ SOURCE_FILE
|
||||||
L_PAREN "("
|
L_PAREN "("
|
||||||
R_PAREN ")"
|
R_PAREN ")"
|
||||||
COMMA ","
|
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 "
|
WHITESPACE "\n "
|
||||||
R_CURLY "}"
|
R_CURLY "}"
|
||||||
WHITESPACE "\n\n "
|
WHITESPACE "\n\n "
|
||||||
|
@ -360,6 +444,28 @@ SOURCE_FILE
|
||||||
TUPLE_EXPR
|
TUPLE_EXPR
|
||||||
L_PAREN "("
|
L_PAREN "("
|
||||||
R_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 "
|
WHITESPACE "\n "
|
||||||
R_CURLY "}"
|
R_CURLY "}"
|
||||||
WHITESPACE "\n"
|
WHITESPACE "\n"
|
||||||
|
|
|
@ -4,25 +4,30 @@ fn main() {
|
||||||
101 ..= 200 => (),
|
101 ..= 200 => (),
|
||||||
200 .. 301 => (),
|
200 .. 301 => (),
|
||||||
302 .. => (),
|
302 .. => (),
|
||||||
|
..= 303 => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
match Some(10 as u8) {
|
match Some(10 as u8) {
|
||||||
Some(0) | None => (),
|
Some(0) | None => (),
|
||||||
Some(1..) => ()
|
Some(1..) => (),
|
||||||
|
Some(..=2) => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
match () {
|
match () {
|
||||||
S { a: 0 } => (),
|
S { a: 0 } => (),
|
||||||
S { a: 1.. } => (),
|
S { a: 1.. } => (),
|
||||||
|
S { a: ..=2 } => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
match () {
|
match () {
|
||||||
[0] => (),
|
[0] => (),
|
||||||
[1..] => (),
|
[1..] => (),
|
||||||
|
[..=2] => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
match (10 as u8, 5 as u8) {
|
match (10 as u8, 5 as u8) {
|
||||||
(0, _) => (),
|
(0, _) => (),
|
||||||
(1.., _) => ()
|
(1.., _) => (),
|
||||||
|
(..=2, _) => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue