@@ -2639,11 +2639,9 @@ impl<'a> Parser<'a> {
2639
2639
while self . token != token:: CloseDelim ( token:: Paren ) {
2640
2640
es. push ( match self . parse_expr ( ) {
2641
2641
Ok ( es) => es,
2642
- Err ( mut err) => { // recover from parse error in tuple list
2643
- err. emit ( ) ;
2644
- self . consume_block ( token:: Paren ) ;
2645
- hi = self . prev_span ;
2646
- return Ok ( self . mk_expr ( lo. to ( hi) , ExprKind :: Err , ThinVec :: new ( ) ) ) ;
2642
+ Err ( err) => {
2643
+ // recover from parse error in tuple list
2644
+ return Ok ( self . recover_seq_parse_error ( token:: Paren , lo, Err ( err) ) ) ;
2647
2645
}
2648
2646
} ) ;
2649
2647
recovered = self . expect_one_of (
@@ -3254,44 +3252,54 @@ impl<'a> Parser<'a> {
3254
3252
}
3255
3253
if self . expr_is_complete ( & e) { break ; }
3256
3254
match self . token {
3257
- // expr(...)
3258
- token:: OpenDelim ( token:: Paren ) => {
3259
- match self . parse_unspanned_seq (
3260
- & token:: OpenDelim ( token:: Paren ) ,
3261
- & token:: CloseDelim ( token:: Paren ) ,
3262
- SeqSep :: trailing_allowed ( token:: Comma ) ,
3263
- |p| Ok ( p. parse_expr ( ) ?)
3264
- ) {
3265
- Ok ( es) => {
3255
+ // expr(...)
3256
+ token:: OpenDelim ( token:: Paren ) => {
3257
+ let seq = self . parse_unspanned_seq (
3258
+ & token:: OpenDelim ( token:: Paren ) ,
3259
+ & token:: CloseDelim ( token:: Paren ) ,
3260
+ SeqSep :: trailing_allowed ( token:: Comma ) ,
3261
+ |p| Ok ( p. parse_expr ( ) ?)
3262
+ ) . map ( |es| {
3266
3263
let nd = self . mk_call ( e, es) ;
3267
- hi = self . prev_span ;
3268
- e = self . mk_expr ( lo. to ( hi) , nd, ThinVec :: new ( ) ) ;
3269
- }
3270
- Err ( mut err) => { // recover from parse error in argument list
3271
- err. emit ( ) ;
3272
- self . consume_block ( token:: Paren ) ;
3273
- hi = self . prev_span ;
3274
- e = self . mk_expr ( lo. to ( hi) , ExprKind :: Err , ThinVec :: new ( ) ) ;
3275
- }
3264
+ let hi = self . prev_span ;
3265
+ self . mk_expr ( lo. to ( hi) , nd, ThinVec :: new ( ) )
3266
+ } ) ;
3267
+ e = self . recover_seq_parse_error ( token:: Paren , lo, seq) ;
3276
3268
}
3277
- }
3278
3269
3279
- // expr[...]
3280
- // Could be either an index expression or a slicing expression.
3281
- token:: OpenDelim ( token:: Bracket ) => {
3282
- self . bump ( ) ;
3283
- let ix = self . parse_expr ( ) ?;
3284
- hi = self . span ;
3285
- self . expect ( & token:: CloseDelim ( token:: Bracket ) ) ?;
3286
- let index = self . mk_index ( e, ix) ;
3287
- e = self . mk_expr ( lo. to ( hi) , index, ThinVec :: new ( ) )
3288
- }
3289
- _ => return Ok ( e)
3270
+ // expr[...]
3271
+ // Could be either an index expression or a slicing expression.
3272
+ token:: OpenDelim ( token:: Bracket ) => {
3273
+ self . bump ( ) ;
3274
+ let ix = self . parse_expr ( ) ?;
3275
+ hi = self . span ;
3276
+ self . expect ( & token:: CloseDelim ( token:: Bracket ) ) ?;
3277
+ let index = self . mk_index ( e, ix) ;
3278
+ e = self . mk_expr ( lo. to ( hi) , index, ThinVec :: new ( ) )
3279
+ }
3280
+ _ => return Ok ( e)
3290
3281
}
3291
3282
}
3292
3283
return Ok ( e) ;
3293
3284
}
3294
3285
3286
+ fn recover_seq_parse_error (
3287
+ & mut self ,
3288
+ delim : token:: DelimToken ,
3289
+ lo : Span ,
3290
+ result : PResult < ' a , P < Expr > > ,
3291
+ ) -> P < Expr > {
3292
+ match result {
3293
+ Ok ( x) => x,
3294
+ Err ( mut err) => {
3295
+ err. emit ( ) ;
3296
+ // recover from parse error
3297
+ self . consume_block ( delim) ;
3298
+ self . mk_expr ( lo. to ( self . prev_span ) , ExprKind :: Err , ThinVec :: new ( ) )
3299
+ }
3300
+ }
3301
+ }
3302
+
3295
3303
crate fn process_potential_macro_variable ( & mut self ) {
3296
3304
let ( token, span) = match self . token {
3297
3305
token:: Dollar if self . span . ctxt ( ) != syntax_pos:: hygiene:: SyntaxContext :: empty ( ) &&
0 commit comments