From 2195ecd7e79d3dbcaaa2d5cb641d929ab7afd75c Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 18 Sep 2021 00:50:27 +0300 Subject: [PATCH 1/4] 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 eaf16bc1a103..e870de9de041 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 402950bcc94a..453bef315849 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 4744d8ac0659..d7f0b4382dac 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 533f738e1553..9a0bcdc18e3d 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 4da379d0ed0b..648ffe565481 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); From 46326b8db7a47109242c6671272e942c843305c5 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 18 Sep 2021 00:54:03 +0300 Subject: [PATCH 2/4] minor: better test placement --- crates/parser/src/grammar/items.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/crates/parser/src/grammar/items.rs b/crates/parser/src/grammar/items.rs index 78d99f284a99..13d9f9e1ab48 100644 --- a/crates/parser/src/grammar/items.rs +++ b/crates/parser/src/grammar/items.rs @@ -148,14 +148,13 @@ pub(super) fn opt_item(p: &mut Parser, m: Marker) -> Result<(), Marker> { // impl T for Foo { // default async fn foo() {} // } - - // test default_async_unsafe_fn - // impl T for Foo { - // default async unsafe fn foo() {} - // } T![async] => { let mut maybe_fn = p.nth(2); let is_unsafe = if matches!(maybe_fn, T![unsafe]) { + // test default_async_unsafe_fn + // impl T for Foo { + // default async unsafe fn foo() {} + // } maybe_fn = p.nth(3); true } else { @@ -400,9 +399,9 @@ fn fn_(p: &mut Parser, m: Marker) { // fn foo() where T: Copy {} type_params::opt_where_clause(p); - // test fn_decl - // trait T { fn foo(); } if p.at(T![;]) { + // test fn_decl + // trait T { fn foo(); } p.bump(T![;]); } else { expressions::block_expr(p) From 1feb8e89d5768d45c8c9841e52e7456e4070081b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 18 Sep 2021 00:58:35 +0300 Subject: [PATCH 3/4] minor: cleanup const parsing --- crates/parser/src/grammar/items/consts.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/crates/parser/src/grammar/items/consts.rs b/crates/parser/src/grammar/items/consts.rs index 1b317dd84a94..52379411e41f 100644 --- a/crates/parser/src/grammar/items/consts.rs +++ b/crates/parser/src/grammar/items/consts.rs @@ -1,20 +1,20 @@ use super::*; -pub(super) fn static_(p: &mut Parser, m: Marker) { - const_or_static(p, m, T![static], STATIC) +pub(super) fn konst(p: &mut Parser, m: Marker) { + p.bump(T![const]); + const_or_static(p, m, true) } -pub(super) fn konst(p: &mut Parser, m: Marker) { - const_or_static(p, m, T![const], CONST) +pub(super) fn static_(p: &mut Parser, m: Marker) { + p.bump(T![static]); + const_or_static(p, m, false) } -fn const_or_static(p: &mut Parser, m: Marker, kw: SyntaxKind, def: SyntaxKind) { - assert!(p.at(kw)); - p.bump(kw); +fn const_or_static(p: &mut Parser, m: Marker, is_const: bool) { p.eat(T![mut]); // Allow `_` in place of an identifier in a `const`. - let is_const_underscore = kw == T![const] && p.eat(T![_]); + let is_const_underscore = is_const && p.eat(T![_]); if !is_const_underscore { name(p); } @@ -30,5 +30,5 @@ fn const_or_static(p: &mut Parser, m: Marker, kw: SyntaxKind, def: SyntaxKind) { expressions::expr(p); } p.expect(T![;]); - m.complete(p, def); + m.complete(p, if is_const { CONST } else { STATIC }); } From 3474e3b3b1b1037613bb3c7c6af33b57893fb332 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 18 Sep 2021 01:02:43 +0300 Subject: [PATCH 4/4] intenral: more local tests for statics --- crates/parser/src/grammar/items/consts.rs | 13 ++++--- ...rscore.rast => 0013_anonymous_static.rast} | 0 ...underscore.rs => 0013_anonymous_static.rs} | 0 .../parser/inline/ok/0172_const_item.rast | 20 ++++++++++ .../parser/inline/ok/0172_const_item.rs | 1 + .../inline/ok/0173_anonymous_const.rast | 19 +++++++++ .../parser/inline/ok/0173_anonymous_const.rs | 1 + .../test_data/parser/ok/0024_const_item.rast | 39 +------------------ .../test_data/parser/ok/0024_const_item.rs | 2 - 9 files changed, 50 insertions(+), 45 deletions(-) rename crates/syntax/test_data/parser/inline/err/{0013_static_underscore.rast => 0013_anonymous_static.rast} (100%) rename crates/syntax/test_data/parser/inline/err/{0013_static_underscore.rs => 0013_anonymous_static.rs} (100%) create mode 100644 crates/syntax/test_data/parser/inline/ok/0172_const_item.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0172_const_item.rs create mode 100644 crates/syntax/test_data/parser/inline/ok/0173_anonymous_const.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0173_anonymous_const.rs diff --git a/crates/parser/src/grammar/items/consts.rs b/crates/parser/src/grammar/items/consts.rs index 52379411e41f..93ba7d05fe7b 100644 --- a/crates/parser/src/grammar/items/consts.rs +++ b/crates/parser/src/grammar/items/consts.rs @@ -1,5 +1,7 @@ use super::*; +// test const_item +// const C: u32 = 92; pub(super) fn konst(p: &mut Parser, m: Marker) { p.bump(T![const]); const_or_static(p, m, true) @@ -13,14 +15,15 @@ pub(super) fn static_(p: &mut Parser, m: Marker) { fn const_or_static(p: &mut Parser, m: Marker, is_const: bool) { p.eat(T![mut]); - // Allow `_` in place of an identifier in a `const`. - let is_const_underscore = is_const && p.eat(T![_]); - if !is_const_underscore { + if is_const && p.eat(T![_]) { + // test anonymous_const + // const _: u32 = 0; + } else { + // test_err anonymous_static + // static _: i32 = 5; name(p); } - // test_err static_underscore - // static _: i32 = 5; if p.at(T![:]) { types::ascription(p); } else { diff --git a/crates/syntax/test_data/parser/inline/err/0013_static_underscore.rast b/crates/syntax/test_data/parser/inline/err/0013_anonymous_static.rast similarity index 100% rename from crates/syntax/test_data/parser/inline/err/0013_static_underscore.rast rename to crates/syntax/test_data/parser/inline/err/0013_anonymous_static.rast diff --git a/crates/syntax/test_data/parser/inline/err/0013_static_underscore.rs b/crates/syntax/test_data/parser/inline/err/0013_anonymous_static.rs similarity index 100% rename from crates/syntax/test_data/parser/inline/err/0013_static_underscore.rs rename to crates/syntax/test_data/parser/inline/err/0013_anonymous_static.rs diff --git a/crates/syntax/test_data/parser/inline/ok/0172_const_item.rast b/crates/syntax/test_data/parser/inline/ok/0172_const_item.rast new file mode 100644 index 000000000000..8a61d5e56683 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0172_const_item.rast @@ -0,0 +1,20 @@ +SOURCE_FILE@0..19 + CONST@0..18 + CONST_KW@0..5 "const" + WHITESPACE@5..6 " " + NAME@6..7 + IDENT@6..7 "C" + COLON@7..8 ":" + WHITESPACE@8..9 " " + PATH_TYPE@9..12 + PATH@9..12 + PATH_SEGMENT@9..12 + NAME_REF@9..12 + IDENT@9..12 "u32" + WHITESPACE@12..13 " " + EQ@13..14 "=" + WHITESPACE@14..15 " " + LITERAL@15..17 + INT_NUMBER@15..17 "92" + SEMICOLON@17..18 ";" + WHITESPACE@18..19 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0172_const_item.rs b/crates/syntax/test_data/parser/inline/ok/0172_const_item.rs new file mode 100644 index 000000000000..6d5f5be65dc5 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0172_const_item.rs @@ -0,0 +1 @@ +const C: u32 = 92; diff --git a/crates/syntax/test_data/parser/inline/ok/0173_anonymous_const.rast b/crates/syntax/test_data/parser/inline/ok/0173_anonymous_const.rast new file mode 100644 index 000000000000..68ce503c39d7 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0173_anonymous_const.rast @@ -0,0 +1,19 @@ +SOURCE_FILE@0..18 + CONST@0..17 + CONST_KW@0..5 "const" + WHITESPACE@5..6 " " + UNDERSCORE@6..7 "_" + COLON@7..8 ":" + WHITESPACE@8..9 " " + PATH_TYPE@9..12 + PATH@9..12 + PATH_SEGMENT@9..12 + NAME_REF@9..12 + IDENT@9..12 "u32" + WHITESPACE@12..13 " " + EQ@13..14 "=" + WHITESPACE@14..15 " " + LITERAL@15..16 + INT_NUMBER@15..16 "0" + SEMICOLON@16..17 ";" + WHITESPACE@17..18 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0173_anonymous_const.rs b/crates/syntax/test_data/parser/inline/ok/0173_anonymous_const.rs new file mode 100644 index 000000000000..c1d5cdfc621b --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0173_anonymous_const.rs @@ -0,0 +1 @@ +const _: u32 = 0; diff --git a/crates/syntax/test_data/parser/ok/0024_const_item.rast b/crates/syntax/test_data/parser/ok/0024_const_item.rast index b89ed6f98e05..6b234b0b2418 100644 --- a/crates/syntax/test_data/parser/ok/0024_const_item.rast +++ b/crates/syntax/test_data/parser/ok/0024_const_item.rast @@ -1,38 +1 @@ -SOURCE_FILE@0..39 - CONST@0..17 - CONST_KW@0..5 "const" - WHITESPACE@5..6 " " - UNDERSCORE@6..7 "_" - COLON@7..8 ":" - WHITESPACE@8..9 " " - PATH_TYPE@9..12 - PATH@9..12 - PATH_SEGMENT@9..12 - NAME_REF@9..12 - IDENT@9..12 "u32" - WHITESPACE@12..13 " " - EQ@13..14 "=" - WHITESPACE@14..15 " " - LITERAL@15..16 - INT_NUMBER@15..16 "0" - SEMICOLON@16..17 ";" - WHITESPACE@17..18 "\n" - CONST@18..38 - CONST_KW@18..23 "const" - WHITESPACE@23..24 " " - NAME@24..27 - IDENT@24..27 "FOO" - COLON@27..28 ":" - WHITESPACE@28..29 " " - PATH_TYPE@29..32 - PATH@29..32 - PATH_SEGMENT@29..32 - NAME_REF@29..32 - IDENT@29..32 "u32" - WHITESPACE@32..33 " " - EQ@33..34 "=" - WHITESPACE@34..35 " " - LITERAL@35..37 - INT_NUMBER@35..37 "92" - SEMICOLON@37..38 ";" - WHITESPACE@38..39 "\n" +SOURCE_FILE@0..0 diff --git a/crates/syntax/test_data/parser/ok/0024_const_item.rs b/crates/syntax/test_data/parser/ok/0024_const_item.rs index 1f2ffa0da384..e69de29bb2d1 100644 --- a/crates/syntax/test_data/parser/ok/0024_const_item.rs +++ b/crates/syntax/test_data/parser/ok/0024_const_item.rs @@ -1,2 +0,0 @@ -const _: u32 = 0; -const FOO: u32 = 92;