tuple patterns

This commit is contained in:
Aleksey Kladov 2018-08-07 14:41:03 +03:00
parent a6ba736a50
commit ba21da5274
9 changed files with 66 additions and 8 deletions

View file

@ -140,6 +140,7 @@ Grammar(
"PLACEHOLDER_PAT", "PLACEHOLDER_PAT",
"PATH_PAT", "PATH_PAT",
"STRUCT_PAT", "STRUCT_PAT",
"TUPLE_STRUCT_PAT",
"TUPLE_PAT", "TUPLE_PAT",
// atoms // atoms

View file

@ -16,6 +16,7 @@ pub(super) fn pattern(p: &mut Parser) {
match la0 { match la0 {
UNDERSCORE => placeholder_pat(p), UNDERSCORE => placeholder_pat(p),
AMP => ref_pat(p), AMP => ref_pat(p),
L_PAREN => tuple_pat(p),
_ => p.err_and_bump("expected pattern"), _ => p.err_and_bump("expected pattern"),
} }
} }
@ -33,7 +34,7 @@ fn path_pat(p: &mut Parser) {
let kind = match p.current() { let kind = match p.current() {
L_PAREN => { L_PAREN => {
tuple_pat_fields(p); tuple_pat_fields(p);
TUPLE_PAT TUPLE_STRUCT_PAT
} }
L_CURLY => { L_CURLY => {
struct_pat_fields(p); struct_pat_fields(p);
@ -116,6 +117,17 @@ fn ref_pat(p: &mut Parser) {
m.complete(p, REF_PAT); m.complete(p, REF_PAT);
} }
// test tuple_pat
// fn main() {
// let (a, b, ..) = ();
// }
fn tuple_pat(p: &mut Parser) {
assert!(p.at(L_PAREN));
let m = p.start();
tuple_pat_fields(p);
m.complete(p, TUPLE_PAT);
}
// test bind_pat // test bind_pat
// fn main() { // fn main() {
// let a = (); // let a = ();

View file

@ -132,6 +132,7 @@ pub enum SyntaxKind {
PLACEHOLDER_PAT, PLACEHOLDER_PAT,
PATH_PAT, PATH_PAT,
STRUCT_PAT, STRUCT_PAT,
TUPLE_STRUCT_PAT,
TUPLE_PAT, TUPLE_PAT,
TUPLE_EXPR, TUPLE_EXPR,
ARRAY_EXPR, ARRAY_EXPR,
@ -371,6 +372,7 @@ impl SyntaxKind {
PLACEHOLDER_PAT => &SyntaxInfo { name: "PLACEHOLDER_PAT" }, PLACEHOLDER_PAT => &SyntaxInfo { name: "PLACEHOLDER_PAT" },
PATH_PAT => &SyntaxInfo { name: "PATH_PAT" }, PATH_PAT => &SyntaxInfo { name: "PATH_PAT" },
STRUCT_PAT => &SyntaxInfo { name: "STRUCT_PAT" }, STRUCT_PAT => &SyntaxInfo { name: "STRUCT_PAT" },
TUPLE_STRUCT_PAT => &SyntaxInfo { name: "TUPLE_STRUCT_PAT" },
TUPLE_PAT => &SyntaxInfo { name: "TUPLE_PAT" }, TUPLE_PAT => &SyntaxInfo { name: "TUPLE_PAT" },
TUPLE_EXPR => &SyntaxInfo { name: "TUPLE_EXPR" }, TUPLE_EXPR => &SyntaxInfo { name: "TUPLE_EXPR" },
ARRAY_EXPR => &SyntaxInfo { name: "ARRAY_EXPR" }, ARRAY_EXPR => &SyntaxInfo { name: "ARRAY_EXPR" },

View file

@ -14,7 +14,7 @@ FILE@[0; 97)
LET_STMT@[15; 28) LET_STMT@[15; 28)
LET_KW@[15; 18) LET_KW@[15; 18)
WHITESPACE@[18; 19) WHITESPACE@[18; 19)
TUPLE_PAT@[19; 22) TUPLE_STRUCT_PAT@[19; 22)
PATH@[19; 20) PATH@[19; 20)
PATH_SEGMENT@[19; 20) PATH_SEGMENT@[19; 20)
NAME_REF@[19; 20) NAME_REF@[19; 20)
@ -32,7 +32,7 @@ FILE@[0; 97)
LET_STMT@[33; 47) LET_STMT@[33; 47)
LET_KW@[33; 36) LET_KW@[33; 36)
WHITESPACE@[36; 37) WHITESPACE@[36; 37)
TUPLE_PAT@[37; 41) TUPLE_STRUCT_PAT@[37; 41)
PATH@[37; 38) PATH@[37; 38)
PATH_SEGMENT@[37; 38) PATH_SEGMENT@[37; 38)
NAME_REF@[37; 38) NAME_REF@[37; 38)
@ -52,7 +52,7 @@ FILE@[0; 97)
LET_STMT@[52; 67) LET_STMT@[52; 67)
LET_KW@[52; 55) LET_KW@[52; 55)
WHITESPACE@[55; 56) WHITESPACE@[55; 56)
TUPLE_PAT@[56; 61) TUPLE_STRUCT_PAT@[56; 61)
PATH@[56; 57) PATH@[56; 57)
PATH_SEGMENT@[56; 57) PATH_SEGMENT@[56; 57)
NAME_REF@[56; 57) NAME_REF@[56; 57)
@ -73,7 +73,7 @@ FILE@[0; 97)
LET_STMT@[72; 94) LET_STMT@[72; 94)
LET_KW@[72; 75) LET_KW@[72; 75)
WHITESPACE@[75; 76) WHITESPACE@[75; 76)
TUPLE_PAT@[76; 88) TUPLE_STRUCT_PAT@[76; 88)
PATH@[76; 77) PATH@[76; 77)
PATH_SEGMENT@[76; 77) PATH_SEGMENT@[76; 77)
NAME_REF@[76; 77) NAME_REF@[76; 77)

View file

@ -74,7 +74,7 @@ FILE@[0; 103)
LET_STMT@[83; 100) LET_STMT@[83; 100)
LET_KW@[83; 86) LET_KW@[83; 86)
WHITESPACE@[86; 87) WHITESPACE@[86; 87)
TUPLE_PAT@[87; 94) TUPLE_STRUCT_PAT@[87; 94)
PATH@[87; 90) PATH@[87; 90)
PATH_SEGMENT@[87; 90) PATH_SEGMENT@[87; 90)
NAME_REF@[87; 90) NAME_REF@[87; 90)

View file

@ -16,7 +16,7 @@ FILE@[0; 38)
WHITESPACE@[13; 14) WHITESPACE@[13; 14)
LET_KW@[14; 17) LET_KW@[14; 17)
WHITESPACE@[17; 18) WHITESPACE@[17; 18)
TUPLE_PAT@[18; 25) TUPLE_STRUCT_PAT@[18; 25)
PATH@[18; 22) PATH@[18; 22)
PATH_SEGMENT@[18; 22) PATH_SEGMENT@[18; 22)
NAME_REF@[18; 22) NAME_REF@[18; 22)

View file

@ -29,7 +29,7 @@ FILE@[0; 70)
WHITESPACE@[39; 40) WHITESPACE@[39; 40)
LET_KW@[40; 43) LET_KW@[40; 43)
WHITESPACE@[43; 44) WHITESPACE@[43; 44)
TUPLE_PAT@[44; 51) TUPLE_STRUCT_PAT@[44; 51)
PATH@[44; 48) PATH@[44; 48)
PATH_SEGMENT@[44; 48) PATH_SEGMENT@[44; 48)
NAME_REF@[44; 48) NAME_REF@[44; 48)

View file

@ -0,0 +1,3 @@
fn main() {
let (a, b, ..) = ();
}

View file

@ -0,0 +1,40 @@
FILE@[0; 39)
FN_ITEM@[0; 38)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
NAME@[3; 7)
IDENT@[3; 7) "main"
PARAM_LIST@[7; 9)
L_PAREN@[7; 8)
R_PAREN@[8; 9)
WHITESPACE@[9; 10)
BLOCK_EXPR@[10; 38)
L_CURLY@[10; 11)
WHITESPACE@[11; 16)
LET_STMT@[16; 36)
LET_KW@[16; 19)
WHITESPACE@[19; 20)
TUPLE_PAT@[20; 30)
L_PAREN@[20; 21)
BIND_PAT@[21; 22)
NAME@[21; 22)
IDENT@[21; 22) "a"
COMMA@[22; 23)
WHITESPACE@[23; 24)
BIND_PAT@[24; 25)
NAME@[24; 25)
IDENT@[24; 25) "b"
COMMA@[25; 26)
WHITESPACE@[26; 27)
DOTDOT@[27; 29)
R_PAREN@[29; 30)
WHITESPACE@[30; 31)
EQ@[31; 32)
WHITESPACE@[32; 33)
TUPLE_EXPR@[33; 35)
L_PAREN@[33; 34)
R_PAREN@[34; 35)
SEMI@[35; 36)
WHITESPACE@[36; 37)
R_CURLY@[37; 38)
WHITESPACE@[38; 39)