Skip to content

Commit d1fc9cf

Browse files
Merge pull request rust-lang#22512 from kupiakos/unnamed-enum-variants
Parse unnamed enum variants
2 parents a9a66c4 + 0f0276a commit d1fc9cf

5 files changed

Lines changed: 31 additions & 15 deletions

File tree

crates/parser/src/grammar/items/adt.rs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -87,24 +87,27 @@ pub(crate) fn variant_list(p: &mut Parser<'_>) {
8787
attributes::outer_attrs(p);
8888
if p.at(IDENT) {
8989
name(p);
90-
match p.current() {
91-
T!['{'] => record_field_list(p),
92-
T!['('] => tuple_field_list(p),
93-
_ => (),
94-
}
95-
96-
// test variant_discriminant
97-
// enum E { X(i32) = 10 }
98-
if p.eat(T![=]) {
99-
let m = p.start();
100-
expressions::expr(p);
101-
m.complete(p, CONST_ARG);
102-
}
103-
m.complete(p, VARIANT);
90+
} else if p.at(T![_]) {
91+
p.bump(T![_]);
10492
} else {
10593
m.abandon(p);
10694
p.err_and_bump("expected enum variant");
95+
return;
96+
}
97+
match p.current() {
98+
T!['{'] => record_field_list(p),
99+
T!['('] => tuple_field_list(p),
100+
_ => (),
101+
}
102+
103+
// test variant_discriminant
104+
// enum E { X(i32) = 10 }
105+
if p.eat(T![=]) {
106+
let m = p.start();
107+
expressions::expr(p);
108+
m.complete(p, CONST_ARG);
107109
}
110+
m.complete(p, VARIANT);
108111
}
109112
}
110113

crates/parser/test_data/parser/ok/0019_enums.rast

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,16 @@ SOURCE_FILE
151151
L_PAREN "("
152152
R_PAREN ")"
153153
COMMA ","
154+
WHITESPACE "\n "
155+
VARIANT
156+
UNDERSCORE "_"
157+
WHITESPACE " "
158+
EQ "="
159+
WHITESPACE " "
160+
CONST_ARG
161+
RANGE_EXPR
162+
DOT2 ".."
163+
COMMA ","
154164
WHITESPACE "\n"
155165
R_CURLY "}"
156166
WHITESPACE "\n"

crates/parser/test_data/parser/ok/0019_enums.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ enum E5 {
2222
F {},
2323
D(u32,),
2424
E(),
25+
_ = ..,
2526
}

crates/syntax/rust.ungram

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ VariantList =
305305

306306
Variant =
307307
Attr* Visibility?
308-
Name FieldList? ('=' ConstArg)?
308+
(Name | '_') FieldList? ('=' ConstArg)?
309309

310310
Union =
311311
Attr* Visibility?

crates/syntax/src/ast/generated/nodes.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2072,6 +2072,8 @@ impl Variant {
20722072
pub fn field_list(&self) -> Option<FieldList> { support::child(&self.syntax) }
20732073
#[inline]
20742074
pub fn eq_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }
2075+
#[inline]
2076+
pub fn underscore_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![_]) }
20752077
}
20762078
pub struct VariantList {
20772079
pub(crate) syntax: SyntaxNode,

0 commit comments

Comments
 (0)