Skip to content

Parse enums #31

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jan 28, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions grammar.ron
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ Grammar(
nodes: [
"FILE",
"STRUCT_ITEM",
"ENUM_ITEM",
"ENUM_VARIANT",
"NAMED_FIELD",
"POS_FIELD",
"FN_ITEM",
Expand Down
6 changes: 6 additions & 0 deletions src/parser/event_parser/grammar/expressions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}
9 changes: 7 additions & 2 deletions src/parser/event_parser/grammar/items/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ 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,];
pub(super) const ITEM_FIRST: TokenSet = 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();
Expand All @@ -34,6 +35,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
Expand Down
34 changes: 34 additions & 0 deletions src/parser/event_parser/grammar/items/structs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
4 changes: 4 additions & 0 deletions src/syntax_kinds.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ pub enum SyntaxKind {
SHEBANG,
FILE,
STRUCT_ITEM,
ENUM_ITEM,
ENUM_VARIANT,
NAMED_FIELD,
POS_FIELD,
FN_ITEM,
Expand Down Expand Up @@ -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" },
Expand Down
14 changes: 13 additions & 1 deletion src/tree/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,19 @@ impl<'f> Node<'f> {

impl<'f> fmt::Debug for Node<'f> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "{:?}@{:?}", self.kind(), self.range())
write!(fmt, "{:?}@{:?}", self.kind(), self.range())?;
if has_short_text(self.kind()) {
write!(fmt, " \"{}\"", self.text())?;
}
Ok(())
}
}

fn has_short_text(kind: SyntaxKind) -> bool {
use syntax_kinds::*;
match kind {
IDENT | LIFETIME => true,
_ => false,
}
}

Expand Down
10 changes: 5 additions & 5 deletions tests/data/parser/err/0000_struct_field_missing_comma.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,21 @@ FILE@[0; 34)
STRUCT_ITEM@[0; 34)
STRUCT_KW@[0; 6)
WHITESPACE@[6; 7)
IDENT@[7; 8)
IDENT@[7; 8) "S"
WHITESPACE@[8; 9)
L_CURLY@[9; 10)
NAMED_FIELD@[10; 26)
WHITESPACE@[10; 15)
IDENT@[15; 16)
IDENT@[15; 16) "a"
COLON@[16; 17)
WHITESPACE@[17; 18)
IDENT@[18; 21)
IDENT@[18; 21) "u32"
WHITESPACE@[21; 26)
err: `expected COMMA`
NAMED_FIELD@[26; 33)
IDENT@[26; 27)
IDENT@[26; 27) "b"
COLON@[27; 28)
WHITESPACE@[28; 29)
IDENT@[29; 32)
IDENT@[29; 32) "u32"
WHITESPACE@[32; 33)
R_CURLY@[33; 34)
6 changes: 3 additions & 3 deletions tests/data/parser/err/0001_item_recovery_in_file.txt
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
FILE@[0; 21)
ERROR@[0; 3)
err: `expected item`
IDENT@[0; 2)
IDENT@[0; 2) "if"
WHITESPACE@[2; 3)
ERROR@[3; 10)
err: `expected item`
IDENT@[3; 8)
IDENT@[3; 8) "match"
WHITESPACE@[8; 10)
STRUCT_ITEM@[10; 21)
STRUCT_KW@[10; 16)
WHITESPACE@[16; 17)
IDENT@[17; 18)
IDENT@[17; 18) "S"
WHITESPACE@[18; 19)
L_CURLY@[19; 20)
R_CURLY@[20; 21)
10 changes: 5 additions & 5 deletions tests/data/parser/err/0003_C++_semicolon.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,22 @@ FILE@[0; 40)
STRUCT_ITEM@[0; 39)
STRUCT_KW@[0; 6)
WHITESPACE@[6; 7)
IDENT@[7; 8)
IDENT@[7; 8) "S"
WHITESPACE@[8; 9)
L_CURLY@[9; 10)
NAMED_FIELD@[10; 21)
WHITESPACE@[10; 15)
IDENT@[15; 16)
IDENT@[15; 16) "a"
COLON@[16; 17)
WHITESPACE@[17; 18)
IDENT@[18; 21)
IDENT@[18; 21) "i32"
COMMA@[21; 22)
NAMED_FIELD@[22; 36)
WHITESPACE@[22; 27)
IDENT@[27; 28)
IDENT@[27; 28) "b"
COLON@[28; 29)
WHITESPACE@[29; 30)
IDENT@[30; 36)
IDENT@[30; 36) "String"
COMMA@[36; 37)
WHITESPACE@[37; 38)
R_CURLY@[38; 39)
Expand Down
2 changes: 1 addition & 1 deletion tests/data/parser/err/0004_use_path_bad_segment.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ FILE@[0; 12)
PATH@[3; 7)
PATH_SEGMENT@[3; 7)
WHITESPACE@[3; 4)
IDENT@[4; 7)
IDENT@[4; 7) "foo"
COLONCOLON@[7; 9)
PATH_SEGMENT@[9; 9)
err: `expected identifier`
Expand Down
10 changes: 5 additions & 5 deletions tests/data/parser/err/0005_attribute_recover.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ FILE@[0; 54)
POUND@[0; 1)
L_BRACK@[1; 2)
META_ITEM@[2; 17)
IDENT@[2; 5)
IDENT@[2; 5) "foo"
L_PAREN@[5; 6)
META_ITEM@[6; 9)
IDENT@[6; 9)
IDENT@[6; 9) "foo"
COMMA@[9; 10)
ERROR@[10; 12)
err: `expected attribute`
Expand All @@ -24,7 +24,7 @@ FILE@[0; 54)
WHITESPACE@[18; 19)
FN_KW@[19; 21)
WHITESPACE@[21; 22)
IDENT@[22; 25)
IDENT@[22; 25) "foo"
L_PAREN@[25; 26)
R_PAREN@[26; 27)
WHITESPACE@[27; 28)
Expand All @@ -37,14 +37,14 @@ FILE@[0; 54)
POUND@[34; 35)
L_BRACK@[35; 36)
META_ITEM@[36; 41)
IDENT@[36; 39)
IDENT@[36; 39) "foo"
L_PAREN@[39; 40)
err: `expected attribute`
WHITESPACE@[40; 41)
err: `expected R_BRACK`
FN_KW@[41; 43)
WHITESPACE@[43; 44)
IDENT@[44; 47)
IDENT@[44; 47) "foo"
L_PAREN@[47; 48)
R_PAREN@[48; 49)
WHITESPACE@[49; 50)
Expand Down
14 changes: 7 additions & 7 deletions tests/data/parser/err/0006_named_field_recovery.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ FILE@[0; 74)
STRUCT_ITEM@[0; 74)
STRUCT_KW@[0; 6)
WHITESPACE@[6; 7)
IDENT@[7; 8)
IDENT@[7; 8) "S"
WHITESPACE@[8; 9)
L_CURLY@[9; 10)
NAMED_FIELD@[10; 21)
WHITESPACE@[10; 15)
IDENT@[15; 16)
IDENT@[15; 16) "f"
COLON@[16; 17)
WHITESPACE@[17; 18)
IDENT@[18; 21)
IDENT@[18; 21) "u32"
COMMA@[21; 22)
VISIBILITY@[22; 31)
WHITESPACE@[22; 27)
Expand All @@ -37,17 +37,17 @@ FILE@[0; 74)
VISIBILITY@[48; 52)
PUB_KW@[48; 51)
WHITESPACE@[51; 52)
IDENT@[52; 53)
IDENT@[52; 53) "x"
COLON@[53; 54)
WHITESPACE@[54; 55)
IDENT@[55; 58)
IDENT@[55; 58) "u32"
COMMA@[58; 59)
NAMED_FIELD@[59; 70)
WHITESPACE@[59; 64)
IDENT@[64; 65)
IDENT@[64; 65) "z"
COLON@[65; 66)
WHITESPACE@[66; 67)
IDENT@[67; 70)
IDENT@[67; 70) "f64"
COMMA@[70; 71)
WHITESPACE@[71; 72)
R_CURLY@[72; 73)
Expand Down
4 changes: 2 additions & 2 deletions tests/data/parser/err/0007_stray_curly_in_file.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ FILE@[0; 31)
STRUCT_ITEM@[3; 14)
STRUCT_KW@[3; 9)
WHITESPACE@[9; 10)
IDENT@[10; 11)
IDENT@[10; 11) "S"
SEMI@[11; 12)
WHITESPACE@[12; 14)
ERROR@[14; 17)
Expand All @@ -16,7 +16,7 @@ FILE@[0; 31)
FN_ITEM@[17; 29)
FN_KW@[17; 19)
WHITESPACE@[19; 20)
IDENT@[20; 23)
IDENT@[20; 23) "foo"
L_PAREN@[23; 24)
R_PAREN@[24; 25)
L_CURLY@[25; 26)
Expand Down
10 changes: 5 additions & 5 deletions tests/data/parser/err/0008_item_block_recovery.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ FILE@[0; 95)
FN_ITEM@[0; 14)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
IDENT@[3; 6)
IDENT@[3; 6) "foo"
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
Expand All @@ -12,7 +12,7 @@ FILE@[0; 95)
WHITESPACE@[12; 14)
ERROR@[14; 17)
err: `expected item`
IDENT@[14; 17)
IDENT@[14; 17) "bar"
ERROR@[17; 18)
err: `expected item`
L_PAREN@[17; 18)
Expand All @@ -24,7 +24,7 @@ FILE@[0; 95)
err: `expected item`
L_CURLY@[20; 21)
WHITESPACE@[21; 26)
IDENT@[26; 28)
IDENT@[26; 28) "if"
WHITESPACE@[28; 29)
TRUE_KW@[29; 33)
WHITESPACE@[33; 34)
Expand All @@ -34,7 +34,7 @@ FILE@[0; 95)
WHITESPACE@[45; 50)
R_CURLY@[50; 51)
WHITESPACE@[51; 52)
IDENT@[52; 56)
IDENT@[52; 56) "else"
WHITESPACE@[56; 57)
L_CURLY@[57; 58)
WHITESPACE@[58; 67)
Expand All @@ -51,7 +51,7 @@ FILE@[0; 95)
FN_ITEM@[82; 95)
FN_KW@[82; 84)
WHITESPACE@[84; 85)
IDENT@[85; 88)
IDENT@[85; 88) "baz"
L_PAREN@[88; 89)
R_PAREN@[89; 90)
WHITESPACE@[90; 91)
Expand Down
8 changes: 4 additions & 4 deletions tests/data/parser/err/0009_broken_struct_type_parameter.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ FILE@[0; 43)
STRUCT_ITEM@[0; 12)
STRUCT_KW@[0; 6)
WHITESPACE@[6; 7)
IDENT@[7; 8)
IDENT@[7; 8) "S"
TYPE_PARAM_LIST@[8; 12)
L_ANGLE@[8; 9)
ERROR@[9; 12)
Expand All @@ -27,16 +27,16 @@ FILE@[0; 43)
err: `expected item`
L_CURLY@[17; 18)
WHITESPACE@[18; 23)
IDENT@[23; 24)
IDENT@[23; 24) "f"
COLON@[24; 25)
WHITESPACE@[25; 26)
IDENT@[26; 29)
IDENT@[26; 29) "u32"
WHITESPACE@[29; 30)
R_CURLY@[30; 31)
WHITESPACE@[31; 33)
STRUCT_ITEM@[33; 43)
STRUCT_KW@[33; 39)
WHITESPACE@[39; 40)
IDENT@[40; 41)
IDENT@[40; 41) "T"
SEMI@[41; 42)
WHITESPACE@[42; 43)
2 changes: 1 addition & 1 deletion tests/data/parser/ok/0001_struct_item.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ FILE@[0; 13)
STRUCT_ITEM@[0; 13)
STRUCT_KW@[0; 6)
WHITESPACE@[6; 7)
IDENT@[7; 8)
IDENT@[7; 8) "S"
WHITESPACE@[8; 9)
L_CURLY@[9; 10)
WHITESPACE@[10; 12)
Expand Down
Loading