mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-29 13:25:09 +00:00
Parse ..
as a proper pattern
This commit is contained in:
parent
426112c97e
commit
4a3a15f0e7
1 changed files with 42 additions and 10 deletions
|
@ -2,7 +2,7 @@ use super::*;
|
||||||
|
|
||||||
pub(super) const PATTERN_FIRST: TokenSet = expressions::LITERAL_FIRST
|
pub(super) const PATTERN_FIRST: TokenSet = expressions::LITERAL_FIRST
|
||||||
.union(paths::PATH_FIRST)
|
.union(paths::PATH_FIRST)
|
||||||
.union(token_set![BOX_KW, REF_KW, MUT_KW, L_PAREN, L_BRACK, AMP, UNDERSCORE, MINUS]);
|
.union(token_set![BOX_KW, REF_KW, MUT_KW, L_PAREN, L_BRACK, AMP, UNDERSCORE, MINUS, DOT]);
|
||||||
|
|
||||||
pub(crate) fn pattern(p: &mut Parser) {
|
pub(crate) fn pattern(p: &mut Parser) {
|
||||||
pattern_r(p, PAT_RECOVERY_SET);
|
pattern_r(p, PAT_RECOVERY_SET);
|
||||||
|
@ -73,6 +73,7 @@ fn atom_pat(p: &mut Parser, recovery_set: TokenSet) -> Option<CompletedMarker> {
|
||||||
_ if paths::is_use_path_start(p) => path_pat(p),
|
_ if paths::is_use_path_start(p) => path_pat(p),
|
||||||
_ if is_literal_pat_start(p) => literal_pat(p),
|
_ if is_literal_pat_start(p) => literal_pat(p),
|
||||||
|
|
||||||
|
T![.] if p.at(T![..]) => dot_dot_pat(p),
|
||||||
T![_] => placeholder_pat(p),
|
T![_] => placeholder_pat(p),
|
||||||
T![&] => ref_pat(p),
|
T![&] => ref_pat(p),
|
||||||
T!['('] => tuple_pat(p),
|
T!['('] => tuple_pat(p),
|
||||||
|
@ -163,7 +164,9 @@ fn record_field_pat_list(p: &mut Parser) {
|
||||||
p.bump_any();
|
p.bump_any();
|
||||||
while !p.at(EOF) && !p.at(T!['}']) {
|
while !p.at(EOF) && !p.at(T!['}']) {
|
||||||
match p.current() {
|
match p.current() {
|
||||||
|
// A trailing `..` is *not* treated as a DOT_DOT_PAT.
|
||||||
T![.] if p.at(T![..]) => p.bump(T![..]),
|
T![.] if p.at(T![..]) => p.bump(T![..]),
|
||||||
|
|
||||||
IDENT if p.nth(1) == T![:] => record_field_pat(p),
|
IDENT if p.nth(1) == T![:] => record_field_pat(p),
|
||||||
T!['{'] => error_block(p, "expected ident"),
|
T!['{'] => error_block(p, "expected ident"),
|
||||||
T![box] => {
|
T![box] => {
|
||||||
|
@ -201,6 +204,39 @@ fn placeholder_pat(p: &mut Parser) -> CompletedMarker {
|
||||||
m.complete(p, PLACEHOLDER_PAT)
|
m.complete(p, PLACEHOLDER_PAT)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// test dot_dot_pat
|
||||||
|
// fn main() {
|
||||||
|
// let .. = ();
|
||||||
|
// //
|
||||||
|
// // Tuples
|
||||||
|
// //
|
||||||
|
// let (a, ..) = ();
|
||||||
|
// let (a, ..,) = ();
|
||||||
|
// let Tuple(a, ..) = ();
|
||||||
|
// let Tuple(a, ..,) = ();
|
||||||
|
// let (.., ..) = ();
|
||||||
|
// let Tuple(.., ..) = ();
|
||||||
|
// let (.., a, ..) = ();
|
||||||
|
// let Tuple(.., a, ..) = ();
|
||||||
|
// //
|
||||||
|
// // Slices
|
||||||
|
// //
|
||||||
|
// let [..] = ();
|
||||||
|
// let [head, ..] = ();
|
||||||
|
// let [head, tail @ ..] = ();
|
||||||
|
// let [head, .., cons] = ();
|
||||||
|
// let [head, mid @ .., cons] = ();
|
||||||
|
// let [head, .., .., cons] = ();
|
||||||
|
// let [head, .., mid, tail @ ..] = ();
|
||||||
|
// let [head, .., mid, .., cons] = ();
|
||||||
|
// }
|
||||||
|
fn dot_dot_pat(p: &mut Parser) -> CompletedMarker {
|
||||||
|
assert!(p.at(T![..]));
|
||||||
|
let m = p.start();
|
||||||
|
p.bump(T![..]);
|
||||||
|
m.complete(p, DOT_DOT_PAT)
|
||||||
|
}
|
||||||
|
|
||||||
// test ref_pat
|
// test ref_pat
|
||||||
// fn main() {
|
// fn main() {
|
||||||
// let &a = ();
|
// let &a = ();
|
||||||
|
@ -241,16 +277,12 @@ fn slice_pat(p: &mut Parser) -> CompletedMarker {
|
||||||
|
|
||||||
fn pat_list(p: &mut Parser, ket: SyntaxKind) {
|
fn pat_list(p: &mut Parser, ket: SyntaxKind) {
|
||||||
while !p.at(EOF) && !p.at(ket) {
|
while !p.at(EOF) && !p.at(ket) {
|
||||||
match p.current() {
|
if !p.at_ts(PATTERN_FIRST) {
|
||||||
T![.] if p.at(T![..]) => p.bump(T![..]),
|
p.error("expected a pattern");
|
||||||
_ => {
|
break;
|
||||||
if !p.at_ts(PATTERN_FIRST) {
|
|
||||||
p.error("expected a pattern");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pattern(p)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pattern(p);
|
||||||
if !p.at(ket) {
|
if !p.at(ket) {
|
||||||
p.expect(T![,]);
|
p.expect(T![,]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue