@@ -2333,51 +2333,7 @@ impl<'a> Parser<'a> {
2333
2333
Restrictions :: RESTRICTION_NO_STRUCT_LITERAL
2334
2334
) ;
2335
2335
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) ;
2381
2337
}
2382
2338
}
2383
2339
@@ -2403,6 +2359,53 @@ impl<'a> Parser<'a> {
2403
2359
return Ok ( self . mk_expr ( lo, hi, ex, attrs) ) ;
2404
2360
}
2405
2361
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
+
2406
2409
fn parse_or_use_outer_attributes ( & mut self ,
2407
2410
already_parsed_attrs : Option < ThinVec < Attribute > > )
2408
2411
-> PResult < ' a , ThinVec < Attribute > > {
0 commit comments