mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-25 20:43:21 +00:00
Parse enums
This commit is contained in:
parent
ab81e4c7b4
commit
b7c141e0b5
7 changed files with 194 additions and 1 deletions
|
@ -74,6 +74,8 @@ Grammar(
|
|||
nodes: [
|
||||
"FILE",
|
||||
"STRUCT_ITEM",
|
||||
"ENUM_ITEM",
|
||||
"ENUM_VARIANT",
|
||||
"NAMED_FIELD",
|
||||
"POS_FIELD",
|
||||
"FN_ITEM",
|
||||
|
|
|
@ -12,3 +12,9 @@ pub(super) fn literal(p: &mut Parser) -> bool {
|
|||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn expr(p: &mut Parser) {
|
||||
if !literal(p) {
|
||||
p.error().message("expected expression").emit();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ pub(super) fn mod_contents(p: &mut Parser, stop_on_r_curly: bool) {
|
|||
}
|
||||
|
||||
pub(super) const ITEM_FIRST: TokenSet =
|
||||
token_set![EXTERN_KW, MOD_KW, USE_KW, STRUCT_KW, FN_KW, PUB_KW, POUND,];
|
||||
token_set![EXTERN_KW, MOD_KW, USE_KW, STRUCT_KW, ENUM_KW, FN_KW, PUB_KW, POUND];
|
||||
|
||||
fn item(p: &mut Parser) {
|
||||
let item = p.start();
|
||||
|
@ -34,6 +34,10 @@ fn item(p: &mut Parser) {
|
|||
structs::struct_item(p);
|
||||
STRUCT_ITEM
|
||||
}
|
||||
ENUM_KW => {
|
||||
structs::enum_item(p);
|
||||
ENUM_ITEM
|
||||
}
|
||||
FN_KW => {
|
||||
fn_item(p);
|
||||
FN_ITEM
|
||||
|
|
|
@ -40,6 +40,40 @@ pub(super) fn struct_item(p: &mut Parser) {
|
|||
}
|
||||
}
|
||||
|
||||
pub(super) fn enum_item(p: &mut Parser) {
|
||||
assert!(p.at(ENUM_KW));
|
||||
p.bump();
|
||||
p.expect(IDENT);
|
||||
type_param_list(p);
|
||||
where_clause(p);
|
||||
if p.expect(L_CURLY) {
|
||||
while !p.at(EOF) && !p.at(R_CURLY) {
|
||||
let var = p.start();
|
||||
attributes::outer_attributes(p);
|
||||
if p.at(IDENT) {
|
||||
p.bump();
|
||||
match p.current() {
|
||||
L_CURLY => named_fields(p),
|
||||
L_PAREN => pos_fields(p),
|
||||
EQ => {
|
||||
p.bump();
|
||||
expressions::expr(p);
|
||||
}
|
||||
_ => ()
|
||||
}
|
||||
var.complete(p, ENUM_VARIANT);
|
||||
} else {
|
||||
var.abandon(p);
|
||||
p.err_and_bump("expected enum variant");
|
||||
}
|
||||
if !p.at(R_CURLY) {
|
||||
p.expect(COMMA);
|
||||
}
|
||||
}
|
||||
p.expect(R_CURLY);
|
||||
}
|
||||
}
|
||||
|
||||
fn named_fields(p: &mut Parser) {
|
||||
assert!(p.at(L_CURLY));
|
||||
p.bump();
|
||||
|
|
|
@ -76,6 +76,8 @@ pub enum SyntaxKind {
|
|||
SHEBANG,
|
||||
FILE,
|
||||
STRUCT_ITEM,
|
||||
ENUM_ITEM,
|
||||
ENUM_VARIANT,
|
||||
NAMED_FIELD,
|
||||
POS_FIELD,
|
||||
FN_ITEM,
|
||||
|
@ -176,6 +178,8 @@ impl SyntaxKind {
|
|||
SHEBANG => &SyntaxInfo { name: "SHEBANG" },
|
||||
FILE => &SyntaxInfo { name: "FILE" },
|
||||
STRUCT_ITEM => &SyntaxInfo { name: "STRUCT_ITEM" },
|
||||
ENUM_ITEM => &SyntaxInfo { name: "ENUM_ITEM" },
|
||||
ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" },
|
||||
NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },
|
||||
POS_FIELD => &SyntaxInfo { name: "POS_FIELD" },
|
||||
FN_ITEM => &SyntaxInfo { name: "FN_ITEM" },
|
||||
|
|
25
tests/data/parser/ok/0019_enums.rs
Normal file
25
tests/data/parser/ok/0019_enums.rs
Normal file
|
@ -0,0 +1,25 @@
|
|||
enum E1 {
|
||||
}
|
||||
|
||||
enum E2<T> {
|
||||
}
|
||||
|
||||
enum E3 {
|
||||
X
|
||||
}
|
||||
|
||||
enum E4 {
|
||||
X,
|
||||
}
|
||||
|
||||
enum E5 {
|
||||
A,
|
||||
B = 92,
|
||||
C {
|
||||
a: u32,
|
||||
pub b: f64,
|
||||
},
|
||||
F {},
|
||||
D(u32,),
|
||||
E(),
|
||||
}
|
118
tests/data/parser/ok/0019_enums.txt
Normal file
118
tests/data/parser/ok/0019_enums.txt
Normal file
|
@ -0,0 +1,118 @@
|
|||
FILE@[0; 182)
|
||||
ENUM_ITEM@[0; 13)
|
||||
ENUM_KW@[0; 4)
|
||||
WHITESPACE@[4; 5)
|
||||
IDENT@[5; 7)
|
||||
WHITESPACE@[7; 8)
|
||||
L_CURLY@[8; 9)
|
||||
WHITESPACE@[9; 10)
|
||||
R_CURLY@[10; 11)
|
||||
WHITESPACE@[11; 13)
|
||||
ENUM_ITEM@[13; 29)
|
||||
ENUM_KW@[13; 17)
|
||||
WHITESPACE@[17; 18)
|
||||
IDENT@[18; 20)
|
||||
TYPE_PARAM_LIST@[20; 24)
|
||||
L_ANGLE@[20; 21)
|
||||
TYPE_PARAM@[21; 22)
|
||||
IDENT@[21; 22)
|
||||
R_ANGLE@[22; 23)
|
||||
WHITESPACE@[23; 24)
|
||||
L_CURLY@[24; 25)
|
||||
WHITESPACE@[25; 26)
|
||||
R_CURLY@[26; 27)
|
||||
WHITESPACE@[27; 29)
|
||||
ENUM_ITEM@[29; 48)
|
||||
ENUM_KW@[29; 33)
|
||||
WHITESPACE@[33; 34)
|
||||
IDENT@[34; 36)
|
||||
WHITESPACE@[36; 37)
|
||||
L_CURLY@[37; 38)
|
||||
ENUM_VARIANT@[38; 45)
|
||||
WHITESPACE@[38; 43)
|
||||
IDENT@[43; 44)
|
||||
WHITESPACE@[44; 45)
|
||||
R_CURLY@[45; 46)
|
||||
WHITESPACE@[46; 48)
|
||||
ENUM_ITEM@[48; 68)
|
||||
ENUM_KW@[48; 52)
|
||||
WHITESPACE@[52; 53)
|
||||
IDENT@[53; 55)
|
||||
WHITESPACE@[55; 56)
|
||||
L_CURLY@[56; 57)
|
||||
ENUM_VARIANT@[57; 63)
|
||||
WHITESPACE@[57; 62)
|
||||
IDENT@[62; 63)
|
||||
COMMA@[63; 64)
|
||||
WHITESPACE@[64; 65)
|
||||
R_CURLY@[65; 66)
|
||||
WHITESPACE@[66; 68)
|
||||
ENUM_ITEM@[68; 182)
|
||||
ENUM_KW@[68; 72)
|
||||
WHITESPACE@[72; 73)
|
||||
IDENT@[73; 75)
|
||||
WHITESPACE@[75; 76)
|
||||
L_CURLY@[76; 77)
|
||||
ENUM_VARIANT@[77; 83)
|
||||
WHITESPACE@[77; 82)
|
||||
IDENT@[82; 83)
|
||||
COMMA@[83; 84)
|
||||
ENUM_VARIANT@[84; 95)
|
||||
WHITESPACE@[84; 89)
|
||||
IDENT@[89; 90)
|
||||
WHITESPACE@[90; 91)
|
||||
EQ@[91; 92)
|
||||
LITERAL@[92; 95)
|
||||
WHITESPACE@[92; 93)
|
||||
INT_NUMBER@[93; 95)
|
||||
COMMA@[95; 96)
|
||||
ENUM_VARIANT@[96; 146)
|
||||
WHITESPACE@[96; 101)
|
||||
IDENT@[101; 102)
|
||||
WHITESPACE@[102; 103)
|
||||
L_CURLY@[103; 104)
|
||||
NAMED_FIELD@[104; 119)
|
||||
WHITESPACE@[104; 113)
|
||||
IDENT@[113; 114)
|
||||
COLON@[114; 115)
|
||||
WHITESPACE@[115; 116)
|
||||
IDENT@[116; 119)
|
||||
COMMA@[119; 120)
|
||||
NAMED_FIELD@[120; 139)
|
||||
VISIBILITY@[120; 133)
|
||||
WHITESPACE@[120; 129)
|
||||
PUB_KW@[129; 132)
|
||||
WHITESPACE@[132; 133)
|
||||
IDENT@[133; 134)
|
||||
COLON@[134; 135)
|
||||
WHITESPACE@[135; 136)
|
||||
IDENT@[136; 139)
|
||||
COMMA@[139; 140)
|
||||
WHITESPACE@[140; 145)
|
||||
R_CURLY@[145; 146)
|
||||
COMMA@[146; 147)
|
||||
ENUM_VARIANT@[147; 156)
|
||||
WHITESPACE@[147; 152)
|
||||
IDENT@[152; 153)
|
||||
WHITESPACE@[153; 154)
|
||||
L_CURLY@[154; 155)
|
||||
R_CURLY@[155; 156)
|
||||
COMMA@[156; 157)
|
||||
ENUM_VARIANT@[157; 169)
|
||||
WHITESPACE@[157; 162)
|
||||
IDENT@[162; 163)
|
||||
L_PAREN@[163; 164)
|
||||
POS_FIELD@[164; 167)
|
||||
IDENT@[164; 167)
|
||||
COMMA@[167; 168)
|
||||
R_PAREN@[168; 169)
|
||||
COMMA@[169; 170)
|
||||
ENUM_VARIANT@[170; 178)
|
||||
WHITESPACE@[170; 175)
|
||||
IDENT@[175; 176)
|
||||
L_PAREN@[176; 177)
|
||||
R_PAREN@[177; 178)
|
||||
COMMA@[178; 179)
|
||||
WHITESPACE@[179; 180)
|
||||
R_CURLY@[180; 181)
|
||||
WHITESPACE@[181; 182)
|
Loading…
Reference in a new issue