Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22512 from kupiakos/unnamed-enum-variants
Parse unnamed enum variants
Chayim Refael Friedman 6 weeks ago
parent a9a66c4 · parent 0f0276a · commit d1fc9cf
-rw-r--r--crates/parser/src/grammar/items/adt.rs31
-rw-r--r--crates/parser/test_data/parser/ok/0019_enums.rast10
-rw-r--r--crates/parser/test_data/parser/ok/0019_enums.rs1
-rw-r--r--crates/syntax/rust.ungram2
-rw-r--r--crates/syntax/src/ast/generated/nodes.rs2
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,