@@ -598,7 +598,7 @@ impl<'a> Parser<'a> {
598
598
599
599
/// Check if the next token is `tok`, and return `true` if so.
600
600
///
601
- /// This method is will automatically add `tok` to `expected_tokens` if `tok` is not
601
+ /// This method will automatically add `tok` to `expected_tokens` if `tok` is not
602
602
/// encountered.
603
603
pub fn check ( & mut self , tok : & token:: Token ) -> bool {
604
604
let is_present = self . token == * tok;
@@ -840,6 +840,12 @@ impl<'a> Parser<'a> {
840
840
return Ok ( ( v, returned) ) ;
841
841
}
842
842
843
+ /// Eat and discard tokens until one of `kets` is encountered. Respects token trees,
844
+ /// passes through any errors encountered. Used for error recovery.
845
+ pub fn eat_to_tokens ( & mut self , kets : & [ & token:: Token ] ) {
846
+ self . parse_seq_to_before_tokens ( kets, seq_sep_none ( ) , |p| p. parse_token_tree ( ) ) ;
847
+ }
848
+
843
849
/// Parse a sequence, including the closing delimiter. The function
844
850
/// f must consume tokens until reaching the next separator or
845
851
/// closing bracket.
@@ -861,13 +867,23 @@ impl<'a> Parser<'a> {
861
867
pub fn parse_seq_to_before_end < T , F > ( & mut self ,
862
868
ket : & token:: Token ,
863
869
sep : SeqSep ,
864
- mut f : F )
870
+ f : F )
865
871
-> Vec < T >
866
872
where F : FnMut ( & mut Parser < ' a > ) -> PResult < ' a , T > ,
873
+ {
874
+ self . parse_seq_to_before_tokens ( & [ ket] , sep, f)
875
+ }
876
+
877
+ pub fn parse_seq_to_before_tokens < T , F > ( & mut self ,
878
+ kets : & [ & token:: Token ] ,
879
+ sep : SeqSep ,
880
+ mut f : F )
881
+ -> Vec < T >
882
+ where F : FnMut ( & mut Parser < ' a > ) -> PResult < ' a , T > ,
867
883
{
868
884
let mut first: bool = true ;
869
885
let mut v = vec ! ( ) ;
870
- while self . token != * ket {
886
+ while !kets . contains ( & & self . token ) {
871
887
match sep. sep {
872
888
Some ( ref t) => {
873
889
if first {
@@ -881,7 +897,9 @@ impl<'a> Parser<'a> {
881
897
}
882
898
_ => ( )
883
899
}
884
- if sep. trailing_sep_allowed && self . check ( ket) { break ; }
900
+ if sep. trailing_sep_allowed && kets. iter ( ) . any ( |k| self . check ( k) ) {
901
+ break ;
902
+ }
885
903
886
904
match f ( self ) {
887
905
Ok ( t) => v. push ( t) ,
@@ -1230,7 +1248,25 @@ impl<'a> Parser<'a> {
1230
1248
} ;
1231
1249
( ident, TraitItemKind :: Const ( ty, default) )
1232
1250
} else {
1233
- let ( constness, unsafety, abi) = try!( p. parse_fn_front_matter ( ) ) ;
1251
+ let ( constness, unsafety, abi) = match p. parse_fn_front_matter ( ) {
1252
+ Ok ( cua) => cua,
1253
+ Err ( e) => {
1254
+ loop {
1255
+ p. bump ( ) ;
1256
+ if p. token == token:: Semi {
1257
+ p. bump ( ) ;
1258
+ break ;
1259
+ }
1260
+
1261
+ if p. token == token:: OpenDelim ( token:: DelimToken :: Brace ) {
1262
+ try!( p. parse_token_tree ( ) ) ;
1263
+ break ;
1264
+ }
1265
+ }
1266
+
1267
+ return Err ( e) ;
1268
+ }
1269
+ } ;
1234
1270
1235
1271
let ident = try!( p. parse_ident ( ) ) ;
1236
1272
let mut generics = try!( p. parse_generics ( ) ) ;
@@ -4181,8 +4217,8 @@ impl<'a> Parser<'a> {
4181
4217
fn forbid_lifetime ( & mut self ) -> PResult < ' a , ( ) > {
4182
4218
if self . token . is_lifetime ( ) {
4183
4219
let span = self . span ;
4184
- return Err ( self . span_fatal ( span, "lifetime parameters must be declared \
4185
- prior to type parameters") )
4220
+ return Err ( self . diagnostic ( ) . struct_span_err ( span, "lifetime parameters must be \
4221
+ declared prior to type parameters") )
4186
4222
}
4187
4223
Ok ( ( ) )
4188
4224
}
@@ -4310,7 +4346,8 @@ impl<'a> Parser<'a> {
4310
4346
fn parse_fn_args ( & mut self , named_args : bool , allow_variadic : bool )
4311
4347
-> PResult < ' a , ( Vec < Arg > , bool ) > {
4312
4348
let sp = self . span ;
4313
- let mut args: Vec < Option < Arg > > =
4349
+ let mut variadic = false ;
4350
+ let args: Vec < Option < Arg > > =
4314
4351
try!( self . parse_unspanned_seq (
4315
4352
& token:: OpenDelim ( token:: Paren ) ,
4316
4353
& token:: CloseDelim ( token:: Paren ) ,
@@ -4321,37 +4358,35 @@ impl<'a> Parser<'a> {
4321
4358
if allow_variadic {
4322
4359
if p. token != token:: CloseDelim ( token:: Paren ) {
4323
4360
let span = p. span ;
4324
- return Err ( p . span_fatal ( span,
4325
- "`...` must be last in argument list for variadic function" ) )
4361
+ p . span_err ( span,
4362
+ "`...` must be last in argument list for variadic function" ) ;
4326
4363
}
4327
4364
} else {
4328
4365
let span = p. span ;
4329
- return Err ( p . span_fatal ( span,
4330
- "only foreign functions are allowed to be variadic" ) )
4366
+ p . span_err ( span,
4367
+ "only foreign functions are allowed to be variadic" ) ;
4331
4368
}
4369
+ variadic = true ;
4332
4370
Ok ( None )
4333
4371
} else {
4334
- Ok ( Some ( try!( p. parse_arg_general ( named_args) ) ) )
4372
+ match p. parse_arg_general ( named_args) {
4373
+ Ok ( arg) => Ok ( Some ( arg) ) ,
4374
+ Err ( mut e) => {
4375
+ e. emit ( ) ;
4376
+ p. eat_to_tokens ( & [ & token:: Comma , & token:: CloseDelim ( token:: Paren ) ] ) ;
4377
+ Ok ( None )
4378
+ }
4379
+ }
4335
4380
}
4336
4381
}
4337
4382
) ) ;
4338
4383
4339
- let variadic = match args. pop ( ) {
4340
- Some ( None ) => true ,
4341
- Some ( x) => {
4342
- // Need to put back that last arg
4343
- args. push ( x) ;
4344
- false
4345
- }
4346
- None => false
4347
- } ;
4348
-
4349
4384
if variadic && args. is_empty ( ) {
4350
4385
self . span_err ( sp,
4351
4386
"variadic function must be declared with at least one named argument" ) ;
4352
4387
}
4353
4388
4354
- let args = args. into_iter ( ) . map ( |x| x. unwrap ( ) ) . collect ( ) ;
4389
+ let args = args. into_iter ( ) . filter_map ( |x| x) . collect ( ) ;
4355
4390
4356
4391
Ok ( ( args, variadic) )
4357
4392
}
@@ -4749,8 +4784,8 @@ impl<'a> Parser<'a> {
4749
4784
// eat a matched-delimiter token tree:
4750
4785
let delim = try!( self . expect_open_delim ( ) ) ;
4751
4786
let tts = try!( self . parse_seq_to_end ( & token:: CloseDelim ( delim) ,
4752
- seq_sep_none ( ) ,
4753
- |p| p. parse_token_tree ( ) ) ) ;
4787
+ seq_sep_none ( ) ,
4788
+ |p| p. parse_token_tree ( ) ) ) ;
4754
4789
let m_ = Mac_ { path : pth, tts : tts, ctxt : EMPTY_CTXT } ;
4755
4790
let m: ast:: Mac = codemap:: Spanned { node : m_,
4756
4791
span : mk_sp ( lo,
@@ -5809,8 +5844,8 @@ impl<'a> Parser<'a> {
5809
5844
// eat a matched-delimiter token tree:
5810
5845
let delim = try!( self . expect_open_delim ( ) ) ;
5811
5846
let tts = try!( self . parse_seq_to_end ( & token:: CloseDelim ( delim) ,
5812
- seq_sep_none ( ) ,
5813
- |p| p. parse_token_tree ( ) ) ) ;
5847
+ seq_sep_none ( ) ,
5848
+ |p| p. parse_token_tree ( ) ) ) ;
5814
5849
// single-variant-enum... :
5815
5850
let m = Mac_ { path : pth, tts : tts, ctxt : EMPTY_CTXT } ;
5816
5851
let m: ast:: Mac = codemap:: Spanned { node : m,
0 commit comments