@@ -2639,11 +2639,9 @@ impl<'a> Parser<'a> {
26392639 while self . token != token:: CloseDelim ( token:: Paren ) {
26402640 es. push ( match self . parse_expr ( ) {
26412641 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) ) ) ;
26472645 }
26482646 } ) ;
26492647 recovered = self . expect_one_of (
@@ -3254,44 +3252,54 @@ impl<'a> Parser<'a> {
32543252 }
32553253 if self . expr_is_complete ( & e) { break ; }
32563254 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| {
32663263 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) ;
32763268 }
3277- }
32783269
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)
32903281 }
32913282 }
32923283 return Ok ( e) ;
32933284 }
32943285
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+
32953303 crate fn process_potential_macro_variable ( & mut self ) {
32963304 let ( token, span) = match self . token {
32973305 token:: Dollar if self . span . ctxt ( ) != syntax_pos:: hygiene:: SyntaxContext :: empty ( ) &&
0 commit comments