Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22512 from kupiakos/unnamed-enum-variants
Parse unnamed enum variants
| -rw-r--r-- | crates/parser/src/grammar/items/adt.rs | 31 | ||||
| -rw-r--r-- | crates/parser/test_data/parser/ok/0019_enums.rast | 10 | ||||
| -rw-r--r-- | crates/parser/test_data/parser/ok/0019_enums.rs | 1 | ||||
| -rw-r--r-- | crates/syntax/rust.ungram | 2 | ||||
| -rw-r--r-- | crates/syntax/src/ast/generated/nodes.rs | 2 |
5 files changed, 31 insertions, 15 deletions
diff --git a/crates/parser/src/grammar/items/adt.rs b/crates/parser/src/grammar/items/adt.rs index a030190ad3..33e19f5725 100644 --- a/crates/parser/src/grammar/items/adt.rs +++ b/crates/parser/src/grammar/items/adt.rs @@ -87,24 +87,27 @@ pub(crate) fn variant_list(p: &mut Parser<'_>) { attributes::outer_attrs(p); if p.at(IDENT) { name(p); - match p.current() { - T!['{'] => record_field_list(p), - T!['('] => tuple_field_list(p), - _ => (), - } - - // test variant_discriminant - // enum E { X(i32) = 10 } - if p.eat(T![=]) { - let m = p.start(); - expressions::expr(p); - m.complete(p, CONST_ARG); - } - m.complete(p, VARIANT); + } else if p.at(T![_]) { + p.bump(T![_]); } else { m.abandon(p); p.err_and_bump("expected enum variant"); + return; + } + match p.current() { + T!['{'] => record_field_list(p), + T!['('] => tuple_field_list(p), + _ => (), + } + + // test variant_discriminant + // enum E { X(i32) = 10 } + if p.eat(T![=]) { + let m = p.start(); + expressions::expr(p); + m.complete(p, CONST_ARG); } + m.complete(p, VARIANT); } } diff --git a/crates/parser/test_data/parser/ok/0019_enums.rast b/crates/parser/test_data/parser/ok/0019_enums.rast index 51837e5372..24256ea294 100644 --- a/crates/parser/test_data/parser/ok/0019_enums.rast +++ b/crates/parser/test_data/parser/ok/0019_enums.rast @@ -151,6 +151,16 @@ SOURCE_FILE L_PAREN "(" R_PAREN ")" COMMA "," + WHITESPACE "\n " + VARIANT + UNDERSCORE "_" + WHITESPACE " " + EQ "=" + WHITESPACE " " + CONST_ARG + RANGE_EXPR + DOT2 ".." + COMMA "," WHITESPACE "\n" R_CURLY "}" WHITESPACE "\n" diff --git a/crates/parser/test_data/parser/ok/0019_enums.rs b/crates/parser/test_data/parser/ok/0019_enums.rs index 7a1afa0e62..f548479e45 100644 --- a/crates/parser/test_data/parser/ok/0019_enums.rs +++ b/crates/parser/test_data/parser/ok/0019_enums.rs @@ -22,4 +22,5 @@ enum E5 { F {}, D(u32,), E(), + _ = .., } diff --git a/crates/syntax/rust.ungram b/crates/syntax/rust.ungram index 3101a254e3..e1c91c41e6 100644 --- a/crates/syntax/rust.ungram +++ b/crates/syntax/rust.ungram @@ -305,7 +305,7 @@ VariantList = Variant = Attr* Visibility? - Name FieldList? ('=' ConstArg)? + (Name | '_') FieldList? ('=' ConstArg)? Union = Attr* Visibility? diff --git a/crates/syntax/src/ast/generated/nodes.rs b/crates/syntax/src/ast/generated/nodes.rs index fcdcc01f44..ac1cddf74c 100644 --- a/crates/syntax/src/ast/generated/nodes.rs +++ b/crates/syntax/src/ast/generated/nodes.rs @@ -2072,6 +2072,8 @@ impl Variant { pub fn field_list(&self) -> Option<FieldList> { support::child(&self.syntax) } #[inline] pub fn eq_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) } + #[inline] + pub fn underscore_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![_]) } } pub struct VariantList { pub(crate) syntax: SyntaxNode, |