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: [
|
nodes: [
|
||||||
"FILE",
|
"FILE",
|
||||||
"STRUCT_ITEM",
|
"STRUCT_ITEM",
|
||||||
|
"ENUM_ITEM",
|
||||||
|
"ENUM_VARIANT",
|
||||||
"NAMED_FIELD",
|
"NAMED_FIELD",
|
||||||
"POS_FIELD",
|
"POS_FIELD",
|
||||||
"FN_ITEM",
|
"FN_ITEM",
|
||||||
|
|
|
@ -12,3 +12,9 @@ pub(super) fn literal(p: &mut Parser) -> bool {
|
||||||
_ => false,
|
_ => 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 =
|
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) {
|
fn item(p: &mut Parser) {
|
||||||
let item = p.start();
|
let item = p.start();
|
||||||
|
@ -34,6 +34,10 @@ fn item(p: &mut Parser) {
|
||||||
structs::struct_item(p);
|
structs::struct_item(p);
|
||||||
STRUCT_ITEM
|
STRUCT_ITEM
|
||||||
}
|
}
|
||||||
|
ENUM_KW => {
|
||||||
|
structs::enum_item(p);
|
||||||
|
ENUM_ITEM
|
||||||
|
}
|
||||||
FN_KW => {
|
FN_KW => {
|
||||||
fn_item(p);
|
fn_item(p);
|
||||||
FN_ITEM
|
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) {
|
fn named_fields(p: &mut Parser) {
|
||||||
assert!(p.at(L_CURLY));
|
assert!(p.at(L_CURLY));
|
||||||
p.bump();
|
p.bump();
|
||||||
|
|
|
@ -76,6 +76,8 @@ pub enum SyntaxKind {
|
||||||
SHEBANG,
|
SHEBANG,
|
||||||
FILE,
|
FILE,
|
||||||
STRUCT_ITEM,
|
STRUCT_ITEM,
|
||||||
|
ENUM_ITEM,
|
||||||
|
ENUM_VARIANT,
|
||||||
NAMED_FIELD,
|
NAMED_FIELD,
|
||||||
POS_FIELD,
|
POS_FIELD,
|
||||||
FN_ITEM,
|
FN_ITEM,
|
||||||
|
@ -176,6 +178,8 @@ impl SyntaxKind {
|
||||||
SHEBANG => &SyntaxInfo { name: "SHEBANG" },
|
SHEBANG => &SyntaxInfo { name: "SHEBANG" },
|
||||||
FILE => &SyntaxInfo { name: "FILE" },
|
FILE => &SyntaxInfo { name: "FILE" },
|
||||||
STRUCT_ITEM => &SyntaxInfo { name: "STRUCT_ITEM" },
|
STRUCT_ITEM => &SyntaxInfo { name: "STRUCT_ITEM" },
|
||||||
|
ENUM_ITEM => &SyntaxInfo { name: "ENUM_ITEM" },
|
||||||
|
ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" },
|
||||||
NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },
|
NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },
|
||||||
POS_FIELD => &SyntaxInfo { name: "POS_FIELD" },
|
POS_FIELD => &SyntaxInfo { name: "POS_FIELD" },
|
||||||
FN_ITEM => &SyntaxInfo { name: "FN_ITEM" },
|
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