@@ -649,10 +649,11 @@ impl<'a> Parser<'a> {
649
649
TokenType :: Token ( t) => Some ( ( * t) . clone ( ) ) ,
650
650
_ => None ,
651
651
} ) ) ;
652
- for ( i, ( delim, span) ) in self . open_braces . iter ( ) . enumerate ( ) {
652
+ // we want to use the last closing delim that would apply
653
+ for ( i, ( delim, span) ) in self . open_braces . iter ( ) . enumerate ( ) . rev ( ) {
653
654
if tokens. contains ( & token:: CloseDelim ( * delim) ) && self . span > * span {
654
655
pos = Some ( i) ;
655
- // do not break, we want to use the last one that would apply
656
+ break ;
656
657
}
657
658
}
658
659
match pos {
@@ -681,6 +682,7 @@ impl<'a> Parser<'a> {
681
682
Applicability :: MaybeIncorrect ,
682
683
) ;
683
684
err. emit ( ) ;
685
+ self . expected_tokens . clear ( ) ; // reduce errors
684
686
Ok ( ( ) )
685
687
}
686
688
_ => Err ( err) ,
@@ -689,11 +691,11 @@ impl<'a> Parser<'a> {
689
691
690
692
/// Expect and consume the token t. Signal an error if
691
693
/// the next token is not t.
692
- pub fn expect ( & mut self , t : & token:: Token ) -> PResult < ' a , ( ) > {
694
+ pub fn expect ( & mut self , t : & token:: Token ) -> PResult < ' a , bool /* recovered */ > {
693
695
if self . expected_tokens . is_empty ( ) {
694
696
if self . token == * t {
695
697
self . bump ( ) ;
696
- Ok ( ( ) )
698
+ Ok ( false )
697
699
} else {
698
700
let token_str = pprust:: token_to_string ( t) ;
699
701
let this_token_str = self . this_token_to_string ( ) ;
@@ -720,7 +722,7 @@ impl<'a> Parser<'a> {
720
722
err. span_label ( self . span , "unexpected token" ) ;
721
723
}
722
724
}
723
- self . recover_closing_delimiter ( & [ t. clone ( ) ] , err)
725
+ self . recover_closing_delimiter ( & [ t. clone ( ) ] , err) . map ( |_| true )
724
726
}
725
727
} else {
726
728
self . expect_one_of ( slice:: from_ref ( t) , & [ ] )
@@ -730,9 +732,11 @@ impl<'a> Parser<'a> {
730
732
/// Expect next token to be edible or inedible token. If edible,
731
733
/// then consume it; if inedible, then return without consuming
732
734
/// anything. Signal a fatal error if next token is unexpected.
733
- fn expect_one_of ( & mut self ,
735
+ fn expect_one_of (
736
+ & mut self ,
734
737
edible : & [ token:: Token ] ,
735
- inedible : & [ token:: Token ] ) -> PResult < ' a , ( ) > {
738
+ inedible : & [ token:: Token ] ,
739
+ ) -> PResult < ' a , bool /* recovered */ > {
736
740
fn tokens_to_string ( tokens : & [ TokenType ] ) -> String {
737
741
let mut i = tokens. iter ( ) ;
738
742
// This might be a sign we need a connect method on Iterator.
@@ -752,10 +756,10 @@ impl<'a> Parser<'a> {
752
756
}
753
757
if edible. contains ( & self . token ) {
754
758
self . bump ( ) ;
755
- Ok ( ( ) )
759
+ Ok ( false )
756
760
} else if inedible. contains ( & self . token ) {
757
761
// leave it in the input
758
- Ok ( ( ) )
762
+ Ok ( false )
759
763
} else {
760
764
let mut expected = edible. iter ( )
761
765
. map ( |x| TokenType :: Token ( x. clone ( ) ) )
@@ -813,7 +817,7 @@ impl<'a> Parser<'a> {
813
817
err. span_label ( self . span , "unexpected token" ) ;
814
818
}
815
819
}
816
- self . recover_closing_delimiter ( edible, err)
820
+ self . recover_closing_delimiter ( edible, err) . map ( |_| true )
817
821
}
818
822
}
819
823
@@ -1112,15 +1116,18 @@ impl<'a> Parser<'a> {
1112
1116
/// Parse a sequence, including the closing delimiter. The function
1113
1117
/// f must consume tokens until reaching the next separator or
1114
1118
/// closing bracket.
1115
- pub fn parse_seq_to_end < T , F > ( & mut self ,
1119
+ pub fn parse_seq_to_end < T , F > (
1120
+ & mut self ,
1116
1121
ket : & token:: Token ,
1117
1122
sep : SeqSep ,
1118
- f : F )
1119
- -> PResult < ' a , Vec < T > > where
1120
- F : FnMut ( & mut Parser < ' a > ) -> PResult < ' a , T > ,
1123
+ f : F ,
1124
+ ) -> PResult < ' a , Vec < T > >
1125
+ where F : FnMut ( & mut Parser < ' a > ) -> PResult < ' a , T > ,
1121
1126
{
1122
- let val = self . parse_seq_to_before_end ( ket, sep, f) ?;
1123
- self . bump ( ) ;
1127
+ let ( val, recovered) = self . parse_seq_to_before_end ( ket, sep, f) ?;
1128
+ if !recovered {
1129
+ self . bump ( ) ;
1130
+ }
1124
1131
Ok ( val)
1125
1132
}
1126
1133
@@ -1132,7 +1139,7 @@ impl<'a> Parser<'a> {
1132
1139
ket : & token:: Token ,
1133
1140
sep : SeqSep ,
1134
1141
f : F ,
1135
- ) -> PResult < ' a , Vec < T > >
1142
+ ) -> PResult < ' a , ( Vec < T > , bool /* recovered */ ) >
1136
1143
where F : FnMut ( & mut Parser < ' a > ) -> PResult < ' a , T >
1137
1144
{
1138
1145
self . parse_seq_to_before_tokens ( & [ ket] , sep, TokenExpectType :: Expect , f)
@@ -1144,10 +1151,11 @@ impl<'a> Parser<'a> {
1144
1151
sep : SeqSep ,
1145
1152
expect : TokenExpectType ,
1146
1153
mut f : F ,
1147
- ) -> PResult < ' a , Vec < T > >
1154
+ ) -> PResult < ' a , ( Vec < T > , bool /* recovered */ ) >
1148
1155
where F : FnMut ( & mut Parser < ' a > ) -> PResult < ' a , T >
1149
1156
{
1150
1157
let mut first: bool = true ;
1158
+ let mut recovered = false ;
1151
1159
let mut v = vec ! [ ] ;
1152
1160
while !kets. iter ( ) . any ( |k| {
1153
1161
match expect {
@@ -1163,29 +1171,38 @@ impl<'a> Parser<'a> {
1163
1171
if first {
1164
1172
first = false ;
1165
1173
} else {
1166
- if let Err ( mut e) = self . expect ( t) {
1167
- // Attempt to keep parsing if it was a similar separator
1168
- if let Some ( ref tokens) = t. similar_tokens ( ) {
1169
- if tokens. contains ( & self . token ) {
1170
- self . bump ( ) ;
1171
- }
1174
+ match self . expect ( t) {
1175
+ Ok ( true ) => {
1176
+ recovered = true ;
1177
+ break ;
1172
1178
}
1173
- e. emit ( ) ;
1174
- // Attempt to keep parsing if it was an omitted separator
1175
- match f ( self ) {
1176
- Ok ( t) => {
1177
- v. push ( t) ;
1178
- continue ;
1179
- } ,
1180
- Err ( mut err) => {
1181
- err. cancel ( ) ;
1182
- let kets: Vec < token:: Token > = kets. iter ( )
1183
- . map ( |t| ( * t) . clone ( ) )
1184
- . collect ( ) ;
1185
- let _ = self . recover_closing_delimiter ( & kets[ ..] , e) ;
1186
- break ;
1179
+ Err ( mut e) => {
1180
+ // Attempt to keep parsing if it was a similar separator
1181
+ if let Some ( ref tokens) = t. similar_tokens ( ) {
1182
+ if tokens. contains ( & self . token ) {
1183
+ self . bump ( ) ;
1184
+ }
1185
+ }
1186
+ e. emit ( ) ;
1187
+ // Attempt to keep parsing if it was an omitted separator
1188
+ match f ( self ) {
1189
+ Ok ( t) => {
1190
+ v. push ( t) ;
1191
+ continue ;
1192
+ } ,
1193
+ Err ( mut err) => {
1194
+ err. cancel ( ) ;
1195
+ let kets: Vec < token:: Token > = kets. iter ( )
1196
+ . map ( |t| ( * t) . clone ( ) )
1197
+ . collect ( ) ;
1198
+ if let Ok ( ( ) ) = self . recover_closing_delimiter ( & kets[ ..] , e) {
1199
+ recovered = true ;
1200
+ }
1201
+ break ;
1202
+ }
1187
1203
}
1188
1204
}
1205
+ _ => { }
1189
1206
}
1190
1207
}
1191
1208
}
@@ -1202,13 +1219,13 @@ impl<'a> Parser<'a> {
1202
1219
Ok ( t) => t,
1203
1220
Err ( e) => {
1204
1221
let kets: Vec < token:: Token > = kets. iter ( ) . map ( |t| ( * t) . clone ( ) ) . collect ( ) ;
1205
- return self . recover_closing_delimiter ( & kets[ ..] , e) . map ( |_| v ) ;
1222
+ return self . recover_closing_delimiter ( & kets[ ..] , e) . map ( |_| ( v , true ) ) ;
1206
1223
}
1207
1224
} ;
1208
1225
v. push ( t) ;
1209
1226
}
1210
1227
1211
- Ok ( v )
1228
+ Ok ( ( v , recovered ) )
1212
1229
}
1213
1230
1214
1231
/// Parse a sequence, including the closing delimiter. The function
@@ -1224,8 +1241,10 @@ impl<'a> Parser<'a> {
1224
1241
F : FnMut ( & mut Parser < ' a > ) -> PResult < ' a , T > ,
1225
1242
{
1226
1243
self . expect ( bra) ?;
1227
- let result = self . parse_seq_to_before_end ( ket, sep, f) ?;
1228
- self . eat ( ket) ;
1244
+ let ( result, recovered) = self . parse_seq_to_before_end ( ket, sep, f) ?;
1245
+ if !recovered {
1246
+ self . eat ( ket) ;
1247
+ }
1229
1248
Ok ( result)
1230
1249
}
1231
1250
@@ -1253,6 +1272,7 @@ impl<'a> Parser<'a> {
1253
1272
self . span = next. sp ;
1254
1273
self . token = next. tok ;
1255
1274
self . expected_tokens . clear ( ) ;
1275
+ self . expected_tokens . clear ( ) ;
1256
1276
// check after each token
1257
1277
self . process_potential_macro_variable ( ) ;
1258
1278
}
@@ -2135,12 +2155,14 @@ impl<'a> Parser<'a> {
2135
2155
} else {
2136
2156
// `(T, U) -> R`
2137
2157
self . bump ( ) ; // `(`
2138
- let inputs = self . parse_seq_to_before_tokens (
2158
+ let ( inputs, recovered ) = self . parse_seq_to_before_tokens (
2139
2159
& [ & token:: CloseDelim ( token:: Paren ) ] ,
2140
2160
SeqSep :: trailing_allowed ( token:: Comma ) ,
2141
2161
TokenExpectType :: Expect ,
2142
2162
|p| p. parse_ty ( ) ) ?;
2143
- self . bump ( ) ; // `)`
2163
+ if !recovered {
2164
+ self . bump ( ) ; // `)`
2165
+ }
2144
2166
let span = lo. to ( self . prev_span ) ;
2145
2167
let output = if self . eat ( & token:: RArrow ) {
2146
2168
Some ( self . parse_ty_common ( false , false ) ?)
@@ -2564,6 +2586,7 @@ impl<'a> Parser<'a> {
2564
2586
self . bump ( ) ;
2565
2587
let mut fields = Vec :: new ( ) ;
2566
2588
let mut base = None ;
2589
+ let mut recovered = false ;
2567
2590
2568
2591
attrs. extend ( self . parse_inner_attributes ( ) ?) ;
2569
2592
@@ -2615,7 +2638,7 @@ impl<'a> Parser<'a> {
2615
2638
2616
2639
match self . expect_one_of ( & [ token:: Comma ] ,
2617
2640
& [ token:: CloseDelim ( token:: Brace ) ] ) {
2618
- Ok ( ( ) ) => { }
2641
+ Ok ( r ) => recovered = r ,
2619
2642
Err ( mut e) => {
2620
2643
e. emit ( ) ;
2621
2644
self . recover_stmt ( ) ;
@@ -2625,7 +2648,9 @@ impl<'a> Parser<'a> {
2625
2648
}
2626
2649
2627
2650
let span = lo. to ( self . span ) ;
2628
- self . expect ( & token:: CloseDelim ( token:: Brace ) ) ?;
2651
+ if !recovered {
2652
+ self . expect ( & token:: CloseDelim ( token:: Brace ) ) ?;
2653
+ }
2629
2654
return Ok ( self . mk_expr ( span, ExprKind :: Struct ( pth, fields, base) , attrs) ) ;
2630
2655
}
2631
2656
@@ -5502,24 +5527,29 @@ impl<'a> Parser<'a> {
5502
5527
5503
5528
// Parse the rest of the function parameter list.
5504
5529
let sep = SeqSep :: trailing_allowed ( token:: Comma ) ;
5505
- let fn_inputs = if let Some ( self_arg) = self_arg {
5530
+ let ( fn_inputs, recovered ) = if let Some ( self_arg) = self_arg {
5506
5531
if self . check ( & token:: CloseDelim ( token:: Paren ) ) {
5507
- vec ! [ self_arg]
5532
+ ( vec ! [ self_arg] , false )
5508
5533
} else if self . eat ( & token:: Comma ) {
5509
5534
let mut fn_inputs = vec ! [ self_arg] ;
5510
- fn_inputs. append ( & mut self . parse_seq_to_before_end (
5511
- & token:: CloseDelim ( token:: Paren ) , sep, parse_arg_fn) ?
5512
- ) ;
5513
- fn_inputs
5535
+ let ( mut inputs, recovered) = self . parse_seq_to_before_end (
5536
+ & token:: CloseDelim ( token:: Paren ) ,
5537
+ sep,
5538
+ parse_arg_fn,
5539
+ ) ?;
5540
+ fn_inputs. append ( & mut inputs) ;
5541
+ ( fn_inputs, recovered)
5514
5542
} else {
5515
5543
return self . unexpected ( ) ;
5516
5544
}
5517
5545
} else {
5518
5546
self . parse_seq_to_before_end ( & token:: CloseDelim ( token:: Paren ) , sep, parse_arg_fn) ?
5519
5547
} ;
5520
5548
5521
- // Parse closing paren and return type.
5522
- self . expect ( & token:: CloseDelim ( token:: Paren ) ) ?;
5549
+ if !recovered {
5550
+ // Parse closing paren and return type.
5551
+ self . expect ( & token:: CloseDelim ( token:: Paren ) ) ?;
5552
+ }
5523
5553
Ok ( P ( FnDecl {
5524
5554
inputs : fn_inputs,
5525
5555
output : self . parse_ret_ty ( true ) ?,
@@ -5534,7 +5564,7 @@ impl<'a> Parser<'a> {
5534
5564
Vec :: new ( )
5535
5565
} else {
5536
5566
self . expect ( & token:: BinOp ( token:: Or ) ) ?;
5537
- let args = self . parse_seq_to_before_tokens (
5567
+ let ( args, _ ) = self . parse_seq_to_before_tokens (
5538
5568
& [ & token:: BinOp ( token:: Or ) , & token:: OrOr ] ,
5539
5569
SeqSep :: trailing_allowed ( token:: Comma ) ,
5540
5570
TokenExpectType :: NoExpect ,
@@ -7458,7 +7488,7 @@ impl<'a> Parser<'a> {
7458
7488
// eat a matched-delimiter token tree:
7459
7489
let ( delim, tts) = self . expect_delimited_token_tree ( ) ?;
7460
7490
if delim != MacDelimiter :: Brace {
7461
- self . expect ( & token:: Semi ) ?
7491
+ self . expect ( & token:: Semi ) ?;
7462
7492
}
7463
7493
7464
7494
Ok ( Some ( respan ( lo. to ( self . prev_span ) , Mac_ { path : pth, tts, delim } ) ) )
0 commit comments