@@ -2333,51 +2333,7 @@ impl<'a> Parser<'a> {
23332333 Restrictions :: RESTRICTION_NO_STRUCT_LITERAL
23342334 ) ;
23352335 if !prohibited {
2336- // It's a struct literal.
2337- self . bump ( ) ;
2338- let mut fields = Vec :: new ( ) ;
2339- let mut base = None ;
2340-
2341- attrs. extend ( self . parse_inner_attributes ( ) ?) ;
2342-
2343- while self . token != token:: CloseDelim ( token:: Brace ) {
2344- if self . eat ( & token:: DotDot ) {
2345- match self . parse_expr ( ) {
2346- Ok ( e) => {
2347- base = Some ( e) ;
2348- }
2349- Err ( mut e) => {
2350- e. emit ( ) ;
2351- self . recover_stmt ( ) ;
2352- }
2353- }
2354- break ;
2355- }
2356-
2357- match self . parse_field ( ) {
2358- Ok ( f) => fields. push ( f) ,
2359- Err ( mut e) => {
2360- e. emit ( ) ;
2361- self . recover_stmt ( ) ;
2362- break ;
2363- }
2364- }
2365-
2366- match self . expect_one_of ( & [ token:: Comma ] ,
2367- & [ token:: CloseDelim ( token:: Brace ) ] ) {
2368- Ok ( ( ) ) => { }
2369- Err ( mut e) => {
2370- e. emit ( ) ;
2371- self . recover_stmt ( ) ;
2372- break ;
2373- }
2374- }
2375- }
2376-
2377- hi = self . span . hi ;
2378- self . expect ( & token:: CloseDelim ( token:: Brace ) ) ?;
2379- ex = ExprKind :: Struct ( pth, fields, base) ;
2380- return Ok ( self . mk_expr ( lo, hi, ex, attrs) ) ;
2336+ return self . parse_struct_expr ( lo, pth, attrs) ;
23812337 }
23822338 }
23832339
@@ -2403,6 +2359,53 @@ impl<'a> Parser<'a> {
24032359 return Ok ( self . mk_expr ( lo, hi, ex, attrs) ) ;
24042360 }
24052361
2362+ fn parse_struct_expr ( & mut self , lo : BytePos , pth : ast:: Path , mut attrs : ThinVec < Attribute > )
2363+ -> PResult < ' a , P < Expr > > {
2364+ self . bump ( ) ;
2365+ let mut fields = Vec :: new ( ) ;
2366+ let mut base = None ;
2367+
2368+ attrs. extend ( self . parse_inner_attributes ( ) ?) ;
2369+
2370+ while self . token != token:: CloseDelim ( token:: Brace ) {
2371+ if self . eat ( & token:: DotDot ) {
2372+ match self . parse_expr ( ) {
2373+ Ok ( e) => {
2374+ base = Some ( e) ;
2375+ }
2376+ Err ( mut e) => {
2377+ e. emit ( ) ;
2378+ self . recover_stmt ( ) ;
2379+ }
2380+ }
2381+ break ;
2382+ }
2383+
2384+ match self . parse_field ( ) {
2385+ Ok ( f) => fields. push ( f) ,
2386+ Err ( mut e) => {
2387+ e. emit ( ) ;
2388+ self . recover_stmt ( ) ;
2389+ break ;
2390+ }
2391+ }
2392+
2393+ match self . expect_one_of ( & [ token:: Comma ] ,
2394+ & [ token:: CloseDelim ( token:: Brace ) ] ) {
2395+ Ok ( ( ) ) => { }
2396+ Err ( mut e) => {
2397+ e. emit ( ) ;
2398+ self . recover_stmt ( ) ;
2399+ break ;
2400+ }
2401+ }
2402+ }
2403+
2404+ let hi = self . span . hi ;
2405+ self . expect ( & token:: CloseDelim ( token:: Brace ) ) ?;
2406+ return Ok ( self . mk_expr ( lo, hi, ExprKind :: Struct ( pth, fields, base) , attrs) ) ;
2407+ }
2408+
24062409 fn parse_or_use_outer_attributes ( & mut self ,
24072410 already_parsed_attrs : Option < ThinVec < Attribute > > )
24082411 -> PResult < ' a , ThinVec < Attribute > > {
0 commit comments