diff --git a/crates/parser/src/grammar/items.rs b/crates/parser/src/grammar/items.rs index af83ba126a2..6405a508ab0 100644 --- a/crates/parser/src/grammar/items.rs +++ b/crates/parser/src/grammar/items.rs @@ -245,29 +245,9 @@ fn opt_item_without_modifiers(p: &mut Parser, m: Marker) -> Result<(), Marker> { T![mod] => mod_item(p, m), T![type] => type_alias(p, m), - - T![struct] => { - // test struct_items - // struct Foo; - // struct Foo {} - // struct Foo(); - // struct Foo(String, usize); - // struct Foo { - // a: i32, - // b: f32, - // } - adt::strukt(p, m); - } + T![struct] => adt::strukt(p, m), T![enum] => adt::enum_(p, m), - IDENT if p.at_contextual_kw("union") && p.nth(1) == IDENT => { - // test union_items - // union Foo {} - // union Foo { - // a: i32, - // b: f32, - // } - adt::union(p, m); - } + IDENT if p.at_contextual_kw("union") && p.nth(1) == IDENT => adt::union(p, m), // test pub_macro_def // pub macro m($:ident) {} @@ -324,6 +304,31 @@ pub(crate) fn mod_item(p: &mut Parser, m: Marker) { m.complete(p, MODULE); } +// test type_alias +// type Foo = Bar; +fn type_alias(p: &mut Parser, m: Marker) { + p.bump(T![type]); + + name(p); + + // test type_item_type_params + // type Result = (); + type_params::opt_generic_param_list(p); + + if p.at(T![:]) { + type_params::bounds(p); + } + + // test type_item_where_clause + // type Foo where Foo: Copy = (); + type_params::opt_where_clause(p); + if p.eat(T![=]) { + types::type_(p); + } + p.expect(T![;]); + m.complete(p, TYPE_ALIAS); +} + pub(crate) fn item_list(p: &mut Parser) { assert!(p.at(T!['{'])); let m = p.start(); @@ -374,32 +379,6 @@ fn fn_(p: &mut Parser) { } } -// test type_item -// type Foo = Bar; -fn type_alias(p: &mut Parser, m: Marker) { - assert!(p.at(T![type])); - p.bump(T![type]); - - name(p); - - // test type_item_type_params - // type Result = (); - type_params::opt_generic_param_list(p); - - if p.at(T![:]) { - type_params::bounds(p); - } - - // test type_item_where_clause - // type Foo where Foo: Copy = (); - type_params::opt_where_clause(p); - if p.eat(T![=]) { - types::type_(p); - } - p.expect(T![;]); - m.complete(p, TYPE_ALIAS); -} - fn macro_rules(p: &mut Parser, m: Marker) { assert!(p.at_contextual_kw("macro_rules")); p.bump_remap(T![macro_rules]); diff --git a/crates/parser/src/grammar/items/adt.rs b/crates/parser/src/grammar/items/adt.rs index 386d3806c32..eaf16bc1a10 100644 --- a/crates/parser/src/grammar/items/adt.rs +++ b/crates/parser/src/grammar/items/adt.rs @@ -1,18 +1,21 @@ use super::*; +// test struct_item +// struct S {} pub(super) fn strukt(p: &mut Parser, m: Marker) { - assert!(p.at(T![struct])); p.bump(T![struct]); - struct_or_union(p, m, T![struct], STRUCT); + struct_or_union(p, m, true); } +// test union_item +// struct U { i: i32, f: f32 } pub(super) fn union(p: &mut Parser, m: Marker) { assert!(p.at_contextual_kw("union")); p.bump_remap(T![union]); - struct_or_union(p, m, T![union], UNION); + struct_or_union(p, m, false); } -fn struct_or_union(p: &mut Parser, m: Marker, kw: SyntaxKind, def: SyntaxKind) { +fn struct_or_union(p: &mut Parser, m: Marker, is_struct: bool) { name_r(p, ITEM_RECOVERY_SET); type_params::opt_generic_param_list(p); match p.current() { @@ -29,26 +32,24 @@ fn struct_or_union(p: &mut Parser, m: Marker, kw: SyntaxKind, def: SyntaxKind) { } } } - T![;] if kw == T![struct] => { + T!['{'] => record_field_list(p), + // test unit_struct + // struct S; + T![;] if is_struct => { p.bump(T![;]); } - T!['{'] => record_field_list(p), - T!['('] if kw == T![struct] => { + // test tuple_struct + // struct S(String, usize); + T!['('] if is_struct => { tuple_field_list(p); // test tuple_struct_where - // struct Test(T) where T: Clone; - // struct Test(T); + // struct S(T) where T: Clone; type_params::opt_where_clause(p); p.expect(T![;]); } - _ if kw == T![struct] => { - p.error("expected `;`, `{`, or `(`"); - } - _ => { - p.error("expected `{`"); - } + _ => p.error(if is_struct { "expected `;`, `{`, or `(`" } else { "expected `{`" }), } - m.complete(p, def); + m.complete(p, if is_struct { STRUCT } else { UNION }); } pub(super) fn enum_(p: &mut Parser, m: Marker) { @@ -102,6 +103,8 @@ pub(crate) fn variant_list(p: &mut Parser) { m.complete(p, VARIANT_LIST); } +// test record_field_list +// struct S { a: i32, b: f32 } pub(crate) fn record_field_list(p: &mut Parser) { assert!(p.at(T!['{'])); let m = p.start(); diff --git a/crates/syntax/test_data/parser/inline/ok/0068_union_items.rast b/crates/syntax/test_data/parser/inline/ok/0068_union_items.rast deleted file mode 100644 index 6589e479519..00000000000 --- a/crates/syntax/test_data/parser/inline/ok/0068_union_items.rast +++ /dev/null @@ -1,46 +0,0 @@ -SOURCE_FILE@0..51 - UNION@0..12 - UNION_KW@0..5 "union" - WHITESPACE@5..6 " " - NAME@6..9 - IDENT@6..9 "Foo" - WHITESPACE@9..10 " " - RECORD_FIELD_LIST@10..12 - L_CURLY@10..11 "{" - R_CURLY@11..12 "}" - WHITESPACE@12..13 "\n" - UNION@13..50 - UNION_KW@13..18 "union" - WHITESPACE@18..19 " " - NAME@19..22 - IDENT@19..22 "Foo" - WHITESPACE@22..23 " " - RECORD_FIELD_LIST@23..50 - L_CURLY@23..24 "{" - WHITESPACE@24..29 "\n " - RECORD_FIELD@29..35 - NAME@29..30 - IDENT@29..30 "a" - COLON@30..31 ":" - WHITESPACE@31..32 " " - PATH_TYPE@32..35 - PATH@32..35 - PATH_SEGMENT@32..35 - NAME_REF@32..35 - IDENT@32..35 "i32" - COMMA@35..36 "," - WHITESPACE@36..41 "\n " - RECORD_FIELD@41..47 - NAME@41..42 - IDENT@41..42 "b" - COLON@42..43 ":" - WHITESPACE@43..44 " " - PATH_TYPE@44..47 - PATH@44..47 - PATH_SEGMENT@44..47 - NAME_REF@44..47 - IDENT@44..47 "f32" - COMMA@47..48 "," - WHITESPACE@48..49 "\n" - R_CURLY@49..50 "}" - WHITESPACE@50..51 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0068_union_items.rs b/crates/syntax/test_data/parser/inline/ok/0068_union_items.rs deleted file mode 100644 index b7dd610d80a..00000000000 --- a/crates/syntax/test_data/parser/inline/ok/0068_union_items.rs +++ /dev/null @@ -1,5 +0,0 @@ -union Foo {} -union Foo { - a: i32, - b: f32, -} diff --git a/crates/syntax/test_data/parser/inline/ok/0078_type_item.rast b/crates/syntax/test_data/parser/inline/ok/0078_type_alias.rast similarity index 100% rename from crates/syntax/test_data/parser/inline/ok/0078_type_item.rast rename to crates/syntax/test_data/parser/inline/ok/0078_type_alias.rast diff --git a/crates/syntax/test_data/parser/inline/ok/0078_type_item.rs b/crates/syntax/test_data/parser/inline/ok/0078_type_alias.rs similarity index 100% rename from crates/syntax/test_data/parser/inline/ok/0078_type_item.rs rename to crates/syntax/test_data/parser/inline/ok/0078_type_alias.rs diff --git a/crates/syntax/test_data/parser/inline/ok/0083_struct_items.rs b/crates/syntax/test_data/parser/inline/ok/0083_struct_items.rs deleted file mode 100644 index 693e3f3ee12..00000000000 --- a/crates/syntax/test_data/parser/inline/ok/0083_struct_items.rs +++ /dev/null @@ -1,8 +0,0 @@ -struct Foo; -struct Foo {} -struct Foo(); -struct Foo(String, usize); -struct Foo { - a: i32, - b: f32, -} diff --git a/crates/syntax/test_data/parser/inline/ok/0114_tuple_struct_where.rast b/crates/syntax/test_data/parser/inline/ok/0114_tuple_struct_where.rast index 0e1594dc485..31961113634 100644 --- a/crates/syntax/test_data/parser/inline/ok/0114_tuple_struct_where.rast +++ b/crates/syntax/test_data/parser/inline/ok/0114_tuple_struct_where.rast @@ -1,64 +1,42 @@ -SOURCE_FILE@0..53 - STRUCT@0..33 +SOURCE_FILE@0..31 + STRUCT@0..30 STRUCT_KW@0..6 "struct" WHITESPACE@6..7 " " - NAME@7..11 - IDENT@7..11 "Test" - GENERIC_PARAM_LIST@11..14 - L_ANGLE@11..12 "<" - TYPE_PARAM@12..13 - NAME@12..13 - IDENT@12..13 "T" - R_ANGLE@13..14 ">" - TUPLE_FIELD_LIST@14..17 - L_PAREN@14..15 "(" - TUPLE_FIELD@15..16 - PATH_TYPE@15..16 - PATH@15..16 - PATH_SEGMENT@15..16 - NAME_REF@15..16 - IDENT@15..16 "T" - R_PAREN@16..17 ")" - WHITESPACE@17..18 " " - WHERE_CLAUSE@18..32 - WHERE_KW@18..23 "where" - WHITESPACE@23..24 " " - WHERE_PRED@24..32 - PATH_TYPE@24..25 - PATH@24..25 - PATH_SEGMENT@24..25 - NAME_REF@24..25 - IDENT@24..25 "T" - COLON@25..26 ":" - WHITESPACE@26..27 " " - TYPE_BOUND_LIST@27..32 - TYPE_BOUND@27..32 - PATH_TYPE@27..32 - PATH@27..32 - PATH_SEGMENT@27..32 - NAME_REF@27..32 - IDENT@27..32 "Clone" - SEMICOLON@32..33 ";" - WHITESPACE@33..34 "\n" - STRUCT@34..52 - STRUCT_KW@34..40 "struct" - WHITESPACE@40..41 " " - NAME@41..45 - IDENT@41..45 "Test" - GENERIC_PARAM_LIST@45..48 - L_ANGLE@45..46 "<" - TYPE_PARAM@46..47 - NAME@46..47 - IDENT@46..47 "T" - R_ANGLE@47..48 ">" - TUPLE_FIELD_LIST@48..51 - L_PAREN@48..49 "(" - TUPLE_FIELD@49..50 - PATH_TYPE@49..50 - PATH@49..50 - PATH_SEGMENT@49..50 - NAME_REF@49..50 - IDENT@49..50 "T" - R_PAREN@50..51 ")" - SEMICOLON@51..52 ";" - WHITESPACE@52..53 "\n" + NAME@7..8 + IDENT@7..8 "S" + GENERIC_PARAM_LIST@8..11 + L_ANGLE@8..9 "<" + TYPE_PARAM@9..10 + NAME@9..10 + IDENT@9..10 "T" + R_ANGLE@10..11 ">" + TUPLE_FIELD_LIST@11..14 + L_PAREN@11..12 "(" + TUPLE_FIELD@12..13 + PATH_TYPE@12..13 + PATH@12..13 + PATH_SEGMENT@12..13 + NAME_REF@12..13 + IDENT@12..13 "T" + R_PAREN@13..14 ")" + WHITESPACE@14..15 " " + WHERE_CLAUSE@15..29 + WHERE_KW@15..20 "where" + WHITESPACE@20..21 " " + WHERE_PRED@21..29 + PATH_TYPE@21..22 + PATH@21..22 + PATH_SEGMENT@21..22 + NAME_REF@21..22 + IDENT@21..22 "T" + COLON@22..23 ":" + WHITESPACE@23..24 " " + TYPE_BOUND_LIST@24..29 + TYPE_BOUND@24..29 + PATH_TYPE@24..29 + PATH@24..29 + PATH_SEGMENT@24..29 + NAME_REF@24..29 + IDENT@24..29 "Clone" + SEMICOLON@29..30 ";" + WHITESPACE@30..31 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0114_tuple_struct_where.rs b/crates/syntax/test_data/parser/inline/ok/0114_tuple_struct_where.rs index ddd59016dc6..a602e001827 100644 --- a/crates/syntax/test_data/parser/inline/ok/0114_tuple_struct_where.rs +++ b/crates/syntax/test_data/parser/inline/ok/0114_tuple_struct_where.rs @@ -1,2 +1 @@ -struct Test(T) where T: Clone; -struct Test(T); +struct S(T) where T: Clone; diff --git a/crates/syntax/test_data/parser/inline/ok/0170_tuple_struct.rast b/crates/syntax/test_data/parser/inline/ok/0170_tuple_struct.rast new file mode 100644 index 00000000000..935fd6e07be --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0170_tuple_struct.rast @@ -0,0 +1,25 @@ +SOURCE_FILE@0..25 + STRUCT@0..24 + STRUCT_KW@0..6 "struct" + WHITESPACE@6..7 " " + NAME@7..8 + IDENT@7..8 "S" + TUPLE_FIELD_LIST@8..23 + L_PAREN@8..9 "(" + TUPLE_FIELD@9..15 + PATH_TYPE@9..15 + PATH@9..15 + PATH_SEGMENT@9..15 + NAME_REF@9..15 + IDENT@9..15 "String" + COMMA@15..16 "," + WHITESPACE@16..17 " " + TUPLE_FIELD@17..22 + PATH_TYPE@17..22 + PATH@17..22 + PATH_SEGMENT@17..22 + NAME_REF@17..22 + IDENT@17..22 "usize" + R_PAREN@22..23 ")" + SEMICOLON@23..24 ";" + WHITESPACE@24..25 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0170_tuple_struct.rs b/crates/syntax/test_data/parser/inline/ok/0170_tuple_struct.rs new file mode 100644 index 00000000000..b4e05717ed3 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0170_tuple_struct.rs @@ -0,0 +1 @@ +struct S(String, usize); diff --git a/crates/syntax/test_data/parser/inline/ok/0171_struct_item.rast b/crates/syntax/test_data/parser/inline/ok/0171_struct_item.rast new file mode 100644 index 00000000000..3134482f0de --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0171_struct_item.rast @@ -0,0 +1,11 @@ +SOURCE_FILE@0..12 + STRUCT@0..11 + STRUCT_KW@0..6 "struct" + WHITESPACE@6..7 " " + NAME@7..8 + IDENT@7..8 "S" + WHITESPACE@8..9 " " + RECORD_FIELD_LIST@9..11 + L_CURLY@9..10 "{" + R_CURLY@10..11 "}" + WHITESPACE@11..12 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0171_struct_item.rs b/crates/syntax/test_data/parser/inline/ok/0171_struct_item.rs new file mode 100644 index 00000000000..5f1a34f49b9 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0171_struct_item.rs @@ -0,0 +1 @@ +struct S {} diff --git a/crates/syntax/test_data/parser/inline/ok/0172_record_field_list.rast b/crates/syntax/test_data/parser/inline/ok/0172_record_field_list.rast new file mode 100644 index 00000000000..ce1135c597d --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0172_record_field_list.rast @@ -0,0 +1,35 @@ +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..27 + L_CURLY@9..10 "{" + WHITESPACE@10..11 " " + RECORD_FIELD@11..17 + NAME@11..12 + IDENT@11..12 "a" + COLON@12..13 ":" + WHITESPACE@13..14 " " + PATH_TYPE@14..17 + PATH@14..17 + PATH_SEGMENT@14..17 + NAME_REF@14..17 + IDENT@14..17 "i32" + COMMA@17..18 "," + WHITESPACE@18..19 " " + RECORD_FIELD@19..25 + NAME@19..20 + IDENT@19..20 "b" + 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/0172_record_field_list.rs b/crates/syntax/test_data/parser/inline/ok/0172_record_field_list.rs new file mode 100644 index 00000000000..a3bd7787db7 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0172_record_field_list.rs @@ -0,0 +1 @@ +struct S { a: i32, b: f32 } diff --git a/crates/syntax/test_data/parser/inline/ok/0173_union_item.rast b/crates/syntax/test_data/parser/inline/ok/0173_union_item.rast new file mode 100644 index 00000000000..5d5c0d69bc0 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0173_union_item.rast @@ -0,0 +1,35 @@ +SOURCE_FILE@0..28 + STRUCT@0..27 + STRUCT_KW@0..6 "struct" + WHITESPACE@6..7 " " + NAME@7..8 + IDENT@7..8 "U" + WHITESPACE@8..9 " " + RECORD_FIELD_LIST@9..27 + L_CURLY@9..10 "{" + WHITESPACE@10..11 " " + RECORD_FIELD@11..17 + NAME@11..12 + IDENT@11..12 "i" + COLON@12..13 ":" + WHITESPACE@13..14 " " + PATH_TYPE@14..17 + PATH@14..17 + PATH_SEGMENT@14..17 + NAME_REF@14..17 + IDENT@14..17 "i32" + COMMA@17..18 "," + WHITESPACE@18..19 " " + RECORD_FIELD@19..25 + 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/0173_union_item.rs b/crates/syntax/test_data/parser/inline/ok/0173_union_item.rs new file mode 100644 index 00000000000..5edf50de3bd --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0173_union_item.rs @@ -0,0 +1 @@ +struct U { i: i32, f: f32 } diff --git a/crates/syntax/test_data/parser/inline/ok/0174_unit_struct.rast b/crates/syntax/test_data/parser/inline/ok/0174_unit_struct.rast new file mode 100644 index 00000000000..b20235889fc --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0174_unit_struct.rast @@ -0,0 +1,8 @@ +SOURCE_FILE@0..10 + STRUCT@0..9 + STRUCT_KW@0..6 "struct" + WHITESPACE@6..7 " " + NAME@7..8 + IDENT@7..8 "S" + SEMICOLON@8..9 ";" + WHITESPACE@9..10 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0174_unit_struct.rs b/crates/syntax/test_data/parser/inline/ok/0174_unit_struct.rs new file mode 100644 index 00000000000..28377c2760b --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0174_unit_struct.rs @@ -0,0 +1 @@ +struct S;