@@ -486,7 +486,8 @@ impl<'a, 'mt> Parser<'a, 'mt> {
486486 }
487487
488488 /// Assumes the current token is Struct.
489- /// Expected pattern: `struct<Identifier>{<ParamList>}`
489+ /// Expected pattern: `struct<Identifier>{<MemberList>}` or
490+ /// `struct<Identifier>(<StructArgMemberList>)`.
490491 fn expect_item_struct (
491492 & mut self ,
492493 attributes : AttributeListGreen < ' a > ,
@@ -495,22 +496,52 @@ impl<'a, 'mt> Parser<'a, 'mt> {
495496 let struct_kw = self . take :: < TerminalStruct < ' _ > > ( ) ;
496497 let name = self . parse_identifier ( ) ;
497498 let generic_params = self . parse_optional_generic_params ( ) ;
498- let lbrace = self . parse_token :: < TerminalLBrace < ' _ > > ( ) ;
499- let members = self . parse_member_list ( ) ;
500- let rbrace = self . parse_token :: < TerminalRBrace < ' _ > > ( ) ;
499+ let body = if self . peek ( ) . kind == SyntaxKind :: TerminalLParen {
500+ let lparen = self . take :: < TerminalLParen < ' _ > > ( ) ;
501+ let members = self . parse_struct_arg_member_list ( ) ;
502+ let rparen = self . parse_token :: < TerminalRParen < ' _ > > ( ) ;
503+ StructBodyParens :: new_green ( self . db , lparen, members, rparen) . into ( )
504+ } else {
505+ let lbrace = self . parse_token :: < TerminalLBrace < ' _ > > ( ) ;
506+ let members = self . parse_member_list ( ) ;
507+ let rbrace = self . parse_token :: < TerminalRBrace < ' _ > > ( ) ;
508+ StructBodyBraces :: new_green ( self . db , lbrace, members, rbrace) . into ( )
509+ } ;
501510 ItemStruct :: new_green (
502511 self . db ,
503512 attributes,
504513 visibility,
505514 struct_kw,
506515 name,
507516 generic_params,
508- lbrace,
509- members,
510- rbrace,
517+ body,
511518 )
512519 }
513520
521+ /// Returns a GreenId of a node with kind StructArgMemberList.
522+ fn parse_struct_arg_member_list ( & mut self ) -> StructArgMemberListGreen < ' a > {
523+ StructArgMemberList :: new_green (
524+ self . db ,
525+ & self . parse_separated_list :: <
526+ StructArgMember < ' _ > ,
527+ TerminalComma < ' _ > ,
528+ StructArgMemberListElementOrSeparatorGreen < ' _ > ,
529+ > (
530+ Self :: try_parse_struct_arg_member,
531+ is_of_kind ! ( rparen, block, lbrace, rbrace, module_item_kw) ,
532+ "type" ,
533+ ) ,
534+ )
535+ }
536+
537+ /// Returns a GreenId of a node with kind StructArgMember, or TryParseFailure if a positional
538+ /// struct member can't be parsed.
539+ fn try_parse_struct_arg_member ( & mut self ) -> TryParseResult < StructArgMemberGreen < ' a > > {
540+ let visibility = self . parse_visibility ( ) ;
541+ let ty = self . try_parse_type_expr ( ) ?;
542+ Ok ( StructArgMember :: new_green ( self . db , visibility, ty) )
543+ }
544+
514545 /// Assumes the current token is Enum.
515546 /// Expected pattern: `enum<Identifier>{<ParamList>}`
516547 fn expect_item_enum (
0 commit comments