From 2195ecd7e79d3dbcaaa2d5cb641d929ab7afd75c Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 18 Sep 2021 00:50:27 +0300 Subject: [PATCH] internal: cleanup adt parsing --- crates/parser/src/grammar/items/adt.rs | 47 ++++---- .../inline/ok/0054_record_field_attrs.rast | 66 +++++------- .../inline/ok/0054_record_field_attrs.rs | 5 +- .../inline/ok/0115_tuple_field_attrs.rast | 101 ++++-------------- .../inline/ok/0115_tuple_field_attrs.rs | 9 +- 5 files changed, 69 insertions(+), 159 deletions(-) diff --git a/crates/parser/src/grammar/items/adt.rs b/crates/parser/src/grammar/items/adt.rs index eaf16bc1a10..e870de9de04 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) { diff --git a/crates/syntax/test_data/parser/inline/ok/0054_record_field_attrs.rast b/crates/syntax/test_data/parser/inline/ok/0054_record_field_attrs.rast index 402950bcc94..453bef31584 100644 --- a/crates/syntax/test_data/parser/inline/ok/0054_record_field_attrs.rast +++ b/crates/syntax/test_data/parser/inline/ok/0054_record_field_attrs.rast @@ -1,45 +1,33 @@ -SOURCE_FILE@0..64 - STRUCT@0..63 +SOURCE_FILE@0..28 + STRUCT@0..27 STRUCT_KW@0..6 "struct" WHITESPACE@6..7 " " NAME@7..8 IDENT@7..8 "S" WHITESPACE@8..9 " " - RECORD_FIELD_LIST@9..63 + RECORD_FIELD_LIST@9..27 L_CURLY@9..10 "{" - WHITESPACE@10..15 "\n " - RECORD_FIELD@15..60 - ATTR@15..43 - POUND@15..16 "#" - L_BRACK@16..17 "[" - META@17..42 - PATH@17..22 - PATH_SEGMENT@17..22 - NAME_REF@17..22 - IDENT@17..22 "serde" - TOKEN_TREE@22..42 - L_PAREN@22..23 "(" - IDENT@23..27 "with" - WHITESPACE@27..28 " " - EQ@28..29 "=" - WHITESPACE@29..30 " " - STRING@30..41 "\"url_serde\"" - R_PAREN@41..42 ")" - R_BRACK@42..43 "]" - WHITESPACE@43..48 "\n " - VISIBILITY@48..51 - PUB_KW@48..51 "pub" - WHITESPACE@51..52 " " - NAME@52..55 - IDENT@52..55 "uri" - COLON@55..56 ":" - WHITESPACE@56..57 " " - PATH_TYPE@57..60 - PATH@57..60 - PATH_SEGMENT@57..60 - NAME_REF@57..60 - IDENT@57..60 "Uri" - COMMA@60..61 "," - WHITESPACE@61..62 "\n" - R_CURLY@62..63 "}" - WHITESPACE@63..64 "\n" + WHITESPACE@10..11 " " + RECORD_FIELD@11..25 + ATTR@11..18 + POUND@11..12 "#" + L_BRACK@12..13 "[" + META@13..17 + PATH@13..17 + PATH_SEGMENT@13..17 + NAME_REF@13..17 + IDENT@13..17 "attr" + R_BRACK@17..18 "]" + WHITESPACE@18..19 " " + NAME@19..20 + IDENT@19..20 "f" + COLON@20..21 ":" + WHITESPACE@21..22 " " + PATH_TYPE@22..25 + PATH@22..25 + PATH_SEGMENT@22..25 + NAME_REF@22..25 + IDENT@22..25 "f32" + WHITESPACE@25..26 " " + R_CURLY@26..27 "}" + WHITESPACE@27..28 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0054_record_field_attrs.rs b/crates/syntax/test_data/parser/inline/ok/0054_record_field_attrs.rs index 4744d8ac065..d7f0b4382da 100644 --- a/crates/syntax/test_data/parser/inline/ok/0054_record_field_attrs.rs +++ b/crates/syntax/test_data/parser/inline/ok/0054_record_field_attrs.rs @@ -1,4 +1 @@ -struct S { - #[serde(with = "url_serde")] - pub uri: Uri, -} +struct S { #[attr] f: f32 } diff --git a/crates/syntax/test_data/parser/inline/ok/0115_tuple_field_attrs.rast b/crates/syntax/test_data/parser/inline/ok/0115_tuple_field_attrs.rast index 533f738e155..9a0bcdc18e3 100644 --- a/crates/syntax/test_data/parser/inline/ok/0115_tuple_field_attrs.rast +++ b/crates/syntax/test_data/parser/inline/ok/0115_tuple_field_attrs.rast @@ -1,85 +1,28 @@ -SOURCE_FILE@0..115 - STRUCT@0..59 +SOURCE_FILE@0..24 + STRUCT@0..23 STRUCT_KW@0..6 "struct" WHITESPACE@6..7 " " NAME@7..8 IDENT@7..8 "S" WHITESPACE@8..9 " " - TUPLE_FIELD_LIST@9..58 + TUPLE_FIELD_LIST@9..22 L_PAREN@9..10 "(" - WHITESPACE@10..15 "\n " - TUPLE_FIELD@15..55 - ATTR@15..43 - POUND@15..16 "#" - L_BRACK@16..17 "[" - META@17..42 - PATH@17..22 - PATH_SEGMENT@17..22 - NAME_REF@17..22 - IDENT@17..22 "serde" - TOKEN_TREE@22..42 - L_PAREN@22..23 "(" - IDENT@23..27 "with" - WHITESPACE@27..28 " " - EQ@28..29 "=" - WHITESPACE@29..30 " " - STRING@30..41 "\"url_serde\"" - R_PAREN@41..42 ")" - R_BRACK@42..43 "]" - WHITESPACE@43..48 "\n " - VISIBILITY@48..51 - PUB_KW@48..51 "pub" - WHITESPACE@51..52 " " - PATH_TYPE@52..55 - PATH@52..55 - PATH_SEGMENT@52..55 - NAME_REF@52..55 - IDENT@52..55 "Uri" - COMMA@55..56 "," - WHITESPACE@56..57 "\n" - R_PAREN@57..58 ")" - SEMICOLON@58..59 ";" - WHITESPACE@59..61 "\n\n" - ENUM@61..114 - ENUM_KW@61..65 "enum" - WHITESPACE@65..66 " " - NAME@66..67 - IDENT@66..67 "S" - WHITESPACE@67..68 " " - VARIANT_LIST@68..114 - L_CURLY@68..69 "{" - WHITESPACE@69..74 "\n " - VARIANT@74..111 - NAME@74..77 - IDENT@74..77 "Uri" - TUPLE_FIELD_LIST@77..111 - L_PAREN@77..78 "(" - TUPLE_FIELD@78..110 - ATTR@78..106 - POUND@78..79 "#" - L_BRACK@79..80 "[" - META@80..105 - PATH@80..85 - PATH_SEGMENT@80..85 - NAME_REF@80..85 - IDENT@80..85 "serde" - TOKEN_TREE@85..105 - L_PAREN@85..86 "(" - IDENT@86..90 "with" - WHITESPACE@90..91 " " - EQ@91..92 "=" - WHITESPACE@92..93 " " - STRING@93..104 "\"url_serde\"" - R_PAREN@104..105 ")" - R_BRACK@105..106 "]" - WHITESPACE@106..107 " " - PATH_TYPE@107..110 - PATH@107..110 - PATH_SEGMENT@107..110 - NAME_REF@107..110 - IDENT@107..110 "Uri" - R_PAREN@110..111 ")" - COMMA@111..112 "," - WHITESPACE@112..113 "\n" - R_CURLY@113..114 "}" - WHITESPACE@114..115 "\n" + TUPLE_FIELD@10..21 + ATTR@10..17 + POUND@10..11 "#" + L_BRACK@11..12 "[" + META@12..16 + PATH@12..16 + PATH_SEGMENT@12..16 + NAME_REF@12..16 + IDENT@12..16 "attr" + R_BRACK@16..17 "]" + WHITESPACE@17..18 " " + PATH_TYPE@18..21 + PATH@18..21 + PATH_SEGMENT@18..21 + NAME_REF@18..21 + IDENT@18..21 "f32" + R_PAREN@21..22 ")" + SEMICOLON@22..23 ";" + WHITESPACE@23..24 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0115_tuple_field_attrs.rs b/crates/syntax/test_data/parser/inline/ok/0115_tuple_field_attrs.rs index 4da379d0ed0..648ffe56548 100644 --- a/crates/syntax/test_data/parser/inline/ok/0115_tuple_field_attrs.rs +++ b/crates/syntax/test_data/parser/inline/ok/0115_tuple_field_attrs.rs @@ -1,8 +1 @@ -struct S ( - #[serde(with = "url_serde")] - pub Uri, -); - -enum S { - Uri(#[serde(with = "url_serde")] Uri), -} +struct S (#[attr] f32);