@@ -81,25 +81,32 @@ pub fn type_expr() -> impl Parser<TokenKind, Ty, Error = PError> {
8181 . map ( TyKind :: Tuple )
8282 . labelled ( "tuple" ) ;
8383
84- let union_parenthesized = ident_part ( )
85- . then_ignore ( ctrl ( '=' ) )
86- . or_not ( )
87- . then ( nested_type_expr. clone ( ) )
88- . padded_by ( new_line ( ) . repeated ( ) )
89- . separated_by ( just ( TokenKind :: Or ) )
90- . allow_trailing ( )
91- . then_ignore ( new_line ( ) . repeated ( ) )
92- . delimited_by ( ctrl ( '(' ) , ctrl ( ')' ) )
93- . recover_with ( nested_delimiters (
94- TokenKind :: Control ( '(' ) ,
95- TokenKind :: Control ( ')' ) ,
96- [
97- ( TokenKind :: Control ( '{' ) , TokenKind :: Control ( '}' ) ) ,
98- ( TokenKind :: Control ( '(' ) , TokenKind :: Control ( ')' ) ) ,
99- ( TokenKind :: Control ( '[' ) , TokenKind :: Control ( ']' ) ) ,
100- ] ,
101- |_| vec ! [ ] ,
102- ) )
84+ let enum_ = keyword ( "enum" )
85+ . ignore_then (
86+ ident_part ( )
87+ . then ( ctrl ( '=' ) . ignore_then ( nested_type_expr. clone ( ) ) . or_not ( ) )
88+ . map ( |( name, ty) | {
89+ (
90+ Some ( name) ,
91+ ty. unwrap_or_else ( || Ty :: new ( TyKind :: Tuple ( vec ! [ ] ) ) ) ,
92+ )
93+ } )
94+ . padded_by ( new_line ( ) . repeated ( ) )
95+ . separated_by ( ctrl ( ',' ) )
96+ . allow_trailing ( )
97+ . then_ignore ( new_line ( ) . repeated ( ) )
98+ . delimited_by ( ctrl ( '{' ) , ctrl ( '}' ) )
99+ . recover_with ( nested_delimiters (
100+ TokenKind :: Control ( '{' ) ,
101+ TokenKind :: Control ( '}' ) ,
102+ [
103+ ( TokenKind :: Control ( '{' ) , TokenKind :: Control ( '}' ) ) ,
104+ ( TokenKind :: Control ( '(' ) , TokenKind :: Control ( ')' ) ) ,
105+ ( TokenKind :: Control ( '[' ) , TokenKind :: Control ( ']' ) ) ,
106+ ] ,
107+ |_| vec ! [ ] ,
108+ ) ) ,
109+ )
103110 . map ( TyKind :: Union )
104111 . labelled ( "union" ) ;
105112
@@ -120,7 +127,7 @@ pub fn type_expr() -> impl Parser<TokenKind, Ty, Error = PError> {
120127 . map ( TyKind :: Array )
121128 . labelled ( "array" ) ;
122129
123- let term = choice ( ( basic, ident, func, tuple, array, union_parenthesized ) )
130+ let term = choice ( ( basic, ident, func, tuple, array, enum_ ) )
124131 . map_with_span ( into_ty)
125132 . boxed ( ) ;
126133
0 commit comments