Skip to content

Commit 94caa9d

Browse files
committed
Merge #31
31: Parse enums r=matklad a=matklad
2 parents ab81e4c + 55e2a47 commit 94caa9d

33 files changed

+377
-171
lines changed

grammar.ron

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ Grammar(
7474
nodes: [
7575
"FILE",
7676
"STRUCT_ITEM",
77+
"ENUM_ITEM",
78+
"ENUM_VARIANT",
7779
"NAMED_FIELD",
7880
"POS_FIELD",
7981
"FN_ITEM",

src/parser/event_parser/grammar/expressions.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,9 @@ pub(super) fn literal(p: &mut Parser) -> bool {
1212
_ => false,
1313
}
1414
}
15+
16+
pub(super) fn expr(p: &mut Parser) {
17+
if !literal(p) {
18+
p.error().message("expected expression").emit();
19+
}
20+
}

src/parser/event_parser/grammar/items/mod.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ pub(super) fn mod_contents(p: &mut Parser, stop_on_r_curly: bool) {
99
}
1010
}
1111

12-
pub(super) const ITEM_FIRST: TokenSet =
13-
token_set![EXTERN_KW, MOD_KW, USE_KW, STRUCT_KW, FN_KW, PUB_KW, POUND,];
12+
pub(super) const ITEM_FIRST: TokenSet = token_set![
13+
EXTERN_KW, MOD_KW, USE_KW, STRUCT_KW, ENUM_KW, FN_KW, PUB_KW, POUND
14+
];
1415

1516
fn item(p: &mut Parser) {
1617
let item = p.start();
@@ -34,6 +35,10 @@ fn item(p: &mut Parser) {
3435
structs::struct_item(p);
3536
STRUCT_ITEM
3637
}
38+
ENUM_KW => {
39+
structs::enum_item(p);
40+
ENUM_ITEM
41+
}
3742
FN_KW => {
3843
fn_item(p);
3944
FN_ITEM

src/parser/event_parser/grammar/items/structs.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,40 @@ pub(super) fn struct_item(p: &mut Parser) {
4040
}
4141
}
4242

43+
pub(super) fn enum_item(p: &mut Parser) {
44+
assert!(p.at(ENUM_KW));
45+
p.bump();
46+
p.expect(IDENT);
47+
type_param_list(p);
48+
where_clause(p);
49+
if p.expect(L_CURLY) {
50+
while !p.at(EOF) && !p.at(R_CURLY) {
51+
let var = p.start();
52+
attributes::outer_attributes(p);
53+
if p.at(IDENT) {
54+
p.bump();
55+
match p.current() {
56+
L_CURLY => named_fields(p),
57+
L_PAREN => pos_fields(p),
58+
EQ => {
59+
p.bump();
60+
expressions::expr(p);
61+
}
62+
_ => (),
63+
}
64+
var.complete(p, ENUM_VARIANT);
65+
} else {
66+
var.abandon(p);
67+
p.err_and_bump("expected enum variant");
68+
}
69+
if !p.at(R_CURLY) {
70+
p.expect(COMMA);
71+
}
72+
}
73+
p.expect(R_CURLY);
74+
}
75+
}
76+
4377
fn named_fields(p: &mut Parser) {
4478
assert!(p.at(L_CURLY));
4579
p.bump();

src/syntax_kinds.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ pub enum SyntaxKind {
7676
SHEBANG,
7777
FILE,
7878
STRUCT_ITEM,
79+
ENUM_ITEM,
80+
ENUM_VARIANT,
7981
NAMED_FIELD,
8082
POS_FIELD,
8183
FN_ITEM,
@@ -176,6 +178,8 @@ impl SyntaxKind {
176178
SHEBANG => &SyntaxInfo { name: "SHEBANG" },
177179
FILE => &SyntaxInfo { name: "FILE" },
178180
STRUCT_ITEM => &SyntaxInfo { name: "STRUCT_ITEM" },
181+
ENUM_ITEM => &SyntaxInfo { name: "ENUM_ITEM" },
182+
ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" },
179183
NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },
180184
POS_FIELD => &SyntaxInfo { name: "POS_FIELD" },
181185
FN_ITEM => &SyntaxInfo { name: "FN_ITEM" },

src/tree/mod.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,19 @@ impl<'f> Node<'f> {
106106

107107
impl<'f> fmt::Debug for Node<'f> {
108108
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
109-
write!(fmt, "{:?}@{:?}", self.kind(), self.range())
109+
write!(fmt, "{:?}@{:?}", self.kind(), self.range())?;
110+
if has_short_text(self.kind()) {
111+
write!(fmt, " \"{}\"", self.text())?;
112+
}
113+
Ok(())
114+
}
115+
}
116+
117+
fn has_short_text(kind: SyntaxKind) -> bool {
118+
use syntax_kinds::*;
119+
match kind {
120+
IDENT | LIFETIME => true,
121+
_ => false,
110122
}
111123
}
112124

tests/data/parser/err/0000_struct_field_missing_comma.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@ FILE@[0; 34)
22
STRUCT_ITEM@[0; 34)
33
STRUCT_KW@[0; 6)
44
WHITESPACE@[6; 7)
5-
IDENT@[7; 8)
5+
IDENT@[7; 8) "S"
66
WHITESPACE@[8; 9)
77
L_CURLY@[9; 10)
88
NAMED_FIELD@[10; 26)
99
WHITESPACE@[10; 15)
10-
IDENT@[15; 16)
10+
IDENT@[15; 16) "a"
1111
COLON@[16; 17)
1212
WHITESPACE@[17; 18)
13-
IDENT@[18; 21)
13+
IDENT@[18; 21) "u32"
1414
WHITESPACE@[21; 26)
1515
err: `expected COMMA`
1616
NAMED_FIELD@[26; 33)
17-
IDENT@[26; 27)
17+
IDENT@[26; 27) "b"
1818
COLON@[27; 28)
1919
WHITESPACE@[28; 29)
20-
IDENT@[29; 32)
20+
IDENT@[29; 32) "u32"
2121
WHITESPACE@[32; 33)
2222
R_CURLY@[33; 34)
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
FILE@[0; 21)
22
ERROR@[0; 3)
33
err: `expected item`
4-
IDENT@[0; 2)
4+
IDENT@[0; 2) "if"
55
WHITESPACE@[2; 3)
66
ERROR@[3; 10)
77
err: `expected item`
8-
IDENT@[3; 8)
8+
IDENT@[3; 8) "match"
99
WHITESPACE@[8; 10)
1010
STRUCT_ITEM@[10; 21)
1111
STRUCT_KW@[10; 16)
1212
WHITESPACE@[16; 17)
13-
IDENT@[17; 18)
13+
IDENT@[17; 18) "S"
1414
WHITESPACE@[18; 19)
1515
L_CURLY@[19; 20)
1616
R_CURLY@[20; 21)

tests/data/parser/err/0003_C++_semicolon.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,22 @@ FILE@[0; 40)
22
STRUCT_ITEM@[0; 39)
33
STRUCT_KW@[0; 6)
44
WHITESPACE@[6; 7)
5-
IDENT@[7; 8)
5+
IDENT@[7; 8) "S"
66
WHITESPACE@[8; 9)
77
L_CURLY@[9; 10)
88
NAMED_FIELD@[10; 21)
99
WHITESPACE@[10; 15)
10-
IDENT@[15; 16)
10+
IDENT@[15; 16) "a"
1111
COLON@[16; 17)
1212
WHITESPACE@[17; 18)
13-
IDENT@[18; 21)
13+
IDENT@[18; 21) "i32"
1414
COMMA@[21; 22)
1515
NAMED_FIELD@[22; 36)
1616
WHITESPACE@[22; 27)
17-
IDENT@[27; 28)
17+
IDENT@[27; 28) "b"
1818
COLON@[28; 29)
1919
WHITESPACE@[29; 30)
20-
IDENT@[30; 36)
20+
IDENT@[30; 36) "String"
2121
COMMA@[36; 37)
2222
WHITESPACE@[37; 38)
2323
R_CURLY@[38; 39)

tests/data/parser/err/0004_use_path_bad_segment.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ FILE@[0; 12)
66
PATH@[3; 7)
77
PATH_SEGMENT@[3; 7)
88
WHITESPACE@[3; 4)
9-
IDENT@[4; 7)
9+
IDENT@[4; 7) "foo"
1010
COLONCOLON@[7; 9)
1111
PATH_SEGMENT@[9; 9)
1212
err: `expected identifier`

0 commit comments

Comments
 (0)