Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/parser/src/grammar/items/adt.rs')
| -rw-r--r-- | crates/parser/src/grammar/items/adt.rs | 47 |
1 files changed, 18 insertions, 29 deletions
diff --git a/crates/parser/src/grammar/items/adt.rs b/crates/parser/src/grammar/items/adt.rs index eaf16bc1a1..e870de9de0 100644 --- a/crates/parser/src/grammar/items/adt.rs +++ b/crates/parser/src/grammar/items/adt.rs @@ -22,9 +22,7 @@ fn struct_or_union(p: &mut Parser, m: Marker, is_struct: bool) { T![where] => { type_params::opt_where_clause(p); match p.current() { - T![;] => { - p.bump(T![;]); - } + T![;] => p.bump(T![;]), T!['{'] => record_field_list(p), _ => { //FIXME: special case `(` error message @@ -53,7 +51,6 @@ fn struct_or_union(p: &mut Parser, m: Marker, is_struct: bool) { } pub(super) fn enum_(p: &mut Parser, m: Marker) { - assert!(p.at(T![enum])); p.bump(T![enum]); name_r(p, ITEM_RECOVERY_SET); type_params::opt_generic_param_list(p); @@ -75,7 +72,16 @@ pub(crate) fn variant_list(p: &mut Parser) { error_block(p, "expected enum variant"); continue; } - let var = p.start(); + variant(p); + if !p.at(T!['}']) { + p.expect(T![,]); + } + } + p.expect(T!['}']); + m.complete(p, VARIANT_LIST); + + fn variant(p: &mut Parser) { + let m = p.start(); attributes::outer_attrs(p); if p.at(IDENT) { name(p); @@ -90,17 +96,12 @@ pub(crate) fn variant_list(p: &mut Parser) { if p.eat(T![=]) { expressions::expr(p); } - var.complete(p, VARIANT); + m.complete(p, VARIANT); } else { - var.abandon(p); + m.abandon(p); p.err_and_bump("expected enum variant"); } - if !p.at(T!['}']) { - p.expect(T![,]); - } } - p.expect(T!['}']); - m.complete(p, VARIANT_LIST); } // test record_field_list @@ -114,7 +115,7 @@ pub(crate) fn record_field_list(p: &mut Parser) { error_block(p, "expected field"); continue; } - record_field_def(p); + record_field(p); if !p.at(T!['}']) { p.expect(T![,]); } @@ -122,13 +123,10 @@ pub(crate) fn record_field_list(p: &mut Parser) { p.expect(T!['}']); m.complete(p, RECORD_FIELD_LIST); - fn record_field_def(p: &mut Parser) { + fn record_field(p: &mut Parser) { let m = p.start(); // test record_field_attrs - // struct S { - // #[serde(with = "url_serde")] - // pub uri: Uri, - // } + // struct S { #[attr] f: f32 } attributes::outer_attrs(p); opt_visibility(p); if p.at(IDENT) { @@ -146,20 +144,11 @@ pub(crate) fn record_field_list(p: &mut Parser) { fn tuple_field_list(p: &mut Parser) { assert!(p.at(T!['('])); let m = p.start(); - if !p.expect(T!['(']) { - return; - } + p.bump(T!['(']); while !p.at(T![')']) && !p.at(EOF) { let m = p.start(); // test tuple_field_attrs - // struct S ( - // #[serde(with = "url_serde")] - // pub Uri, - // ); - // - // enum S { - // Uri(#[serde(with = "url_serde")] Uri), - // } + // struct S (#[attr] f32); attributes::outer_attrs(p); opt_visibility(p); if !p.at_ts(types::TYPE_FIRST) { |