struct literals

This commit is contained in:
Aleksey Kladov 2018-07-31 20:38:36 +03:00
parent eba1e8a334
commit ce3462ce8f
5 changed files with 143 additions and 1 deletions

View file

@ -129,6 +129,8 @@ Grammar(
"METHOD_CALL_EXPR",
"FIELD_EXPR",
"REF_EXPR",
"STRUCT_LIT",
"STRUCT_LIT_FIELD",
"EXTERN_BLOCK",
"ENUM_VARIANT",

View file

@ -154,5 +154,42 @@ fn path_expr(p: &mut Parser) -> CompletedMarker {
assert!(paths::is_path_start(p));
let m = p.start();
paths::expr_path(p);
m.complete(p, PATH_EXPR)
if p.at(L_CURLY) {
struct_lit(p);
m.complete(p, STRUCT_LIT)
} else {
m.complete(p, PATH_EXPR)
}
}
// test struct_lit
// fn foo() {
// S {};
// S { x, y: 32, };
// S { x, y: 32, ..Default::default() };
// }
fn struct_lit(p: &mut Parser) {
assert!(p.at(L_CURLY));
p.bump();
while !p.at(EOF) && !p.at(R_CURLY) {
match p.current() {
IDENT => {
let m = p.start();
name_ref(p);
if p.eat(COLON) {
expr(p);
}
m.complete(p, STRUCT_LIT_FIELD);
},
DOTDOT => {
p.bump();
expr(p);
},
_ => p.err_and_bump("expected identifier"),
}
if !p.at(R_CURLY) {
p.expect(COMMA);
}
}
p.expect(R_CURLY);
}

View file

@ -120,6 +120,8 @@ pub enum SyntaxKind {
METHOD_CALL_EXPR,
FIELD_EXPR,
REF_EXPR,
STRUCT_LIT,
STRUCT_LIT_FIELD,
EXTERN_BLOCK,
ENUM_VARIANT,
NAMED_FIELD,
@ -277,6 +279,8 @@ impl SyntaxKind {
METHOD_CALL_EXPR => &SyntaxInfo { name: "METHOD_CALL_EXPR" },
FIELD_EXPR => &SyntaxInfo { name: "FIELD_EXPR" },
REF_EXPR => &SyntaxInfo { name: "REF_EXPR" },
STRUCT_LIT => &SyntaxInfo { name: "STRUCT_LIT" },
STRUCT_LIT_FIELD => &SyntaxInfo { name: "STRUCT_LIT_FIELD" },
EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" },
ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" },
NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },

View file

@ -0,0 +1,5 @@
fn foo() {
S {};
S { x, y: 32, };
S { x, y: 32, ..Default::default() };
}

View file

@ -0,0 +1,94 @@
FILE@[0; 86)
FN_ITEM@[0; 86)
FN_KW@[0; 2)
NAME@[2; 6)
WHITESPACE@[2; 3)
IDENT@[3; 6) "foo"
PARAM_LIST@[6; 9)
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
BLOCK@[9; 86)
L_CURLY@[9; 10)
EXPR_STMT@[10; 25)
STRUCT_LIT@[10; 19)
PATH@[10; 17)
PATH_SEGMENT@[10; 17)
NAME_REF@[10; 17)
WHITESPACE@[10; 15)
IDENT@[15; 16) "S"
WHITESPACE@[16; 17)
L_CURLY@[17; 18)
R_CURLY@[18; 19)
SEMI@[19; 20)
WHITESPACE@[20; 25)
EXPR_STMT@[25; 46)
STRUCT_LIT@[25; 40)
PATH@[25; 27)
PATH_SEGMENT@[25; 27)
NAME_REF@[25; 27)
IDENT@[25; 26) "S"
WHITESPACE@[26; 27)
L_CURLY@[27; 28)
STRUCT_LIT_FIELD@[28; 30)
NAME_REF@[28; 30)
WHITESPACE@[28; 29)
IDENT@[29; 30) "x"
COMMA@[30; 31)
STRUCT_LIT_FIELD@[31; 37)
NAME_REF@[31; 33)
WHITESPACE@[31; 32)
IDENT@[32; 33) "y"
COLON@[33; 34)
LITERAL@[34; 37)
WHITESPACE@[34; 35)
INT_NUMBER@[35; 37)
COMMA@[37; 38)
WHITESPACE@[38; 39)
R_CURLY@[39; 40)
SEMI@[40; 41)
WHITESPACE@[41; 46)
EXPR_STMT@[46; 84)
STRUCT_LIT@[46; 82)
PATH@[46; 48)
PATH_SEGMENT@[46; 48)
NAME_REF@[46; 48)
IDENT@[46; 47) "S"
WHITESPACE@[47; 48)
L_CURLY@[48; 49)
STRUCT_LIT_FIELD@[49; 51)
NAME_REF@[49; 51)
WHITESPACE@[49; 50)
IDENT@[50; 51) "x"
COMMA@[51; 52)
STRUCT_LIT_FIELD@[52; 58)
NAME_REF@[52; 54)
WHITESPACE@[52; 53)
IDENT@[53; 54) "y"
COLON@[54; 55)
LITERAL@[55; 58)
WHITESPACE@[55; 56)
INT_NUMBER@[56; 58)
COMMA@[58; 59)
WHITESPACE@[59; 60)
DOTDOT@[60; 62)
CALL_EXPR@[62; 81)
PATH_EXPR@[62; 78)
PATH@[62; 78)
PATH@[62; 69)
PATH_SEGMENT@[62; 69)
NAME_REF@[62; 69)
IDENT@[62; 69) "Default"
COLONCOLON@[69; 71)
PATH_SEGMENT@[71; 78)
NAME_REF@[71; 78)
IDENT@[71; 78) "default"
ARG_LIST@[78; 81)
L_PAREN@[78; 79)
R_PAREN@[79; 80)
WHITESPACE@[80; 81)
R_CURLY@[81; 82)
SEMI@[82; 83)
WHITESPACE@[83; 84)
R_CURLY@[84; 85)
WHITESPACE@[85; 86)