@@ -72,50 +72,6 @@ bitflags! {
72
72
73
73
type ItemInfo = ( Ident , ItemKind , Option < Vec < Attribute > > ) ;
74
74
75
- enum HasRecovered < ' a , T > {
76
- Success ( T ) ,
77
- Recovered ( T , DiagnosticBuilder < ' a > ) ,
78
- }
79
-
80
- impl < ' a , T > HasRecovered < ' a , T > {
81
- fn new ( t : T , err : Option < DiagnosticBuilder < ' a > > ) -> HasRecovered < ' a , T > {
82
- if let Some ( err) = err {
83
- HasRecovered :: Recovered ( t, err)
84
- } else {
85
- HasRecovered :: Success ( t)
86
- }
87
- }
88
-
89
- fn map < O , F : FnOnce ( T ) -> O > ( self , f : F ) -> HasRecovered < ' a , O > {
90
- let ( t, e) = self . full_unwrap ( ) ;
91
- HasRecovered :: new ( f ( t) , e)
92
- }
93
-
94
- fn emit ( self ) -> T {
95
- match self {
96
- HasRecovered :: Recovered ( t, mut err) => {
97
- err. emit ( ) ;
98
- t
99
- }
100
- HasRecovered :: Success ( t) => t,
101
- }
102
- }
103
-
104
- fn full_unwrap ( self ) -> ( T , Option < DiagnosticBuilder < ' a > > ) {
105
- match self {
106
- HasRecovered :: Recovered ( t, err) => ( t, Some ( err) ) ,
107
- HasRecovered :: Success ( t) => ( t, None ) ,
108
- }
109
- }
110
-
111
- fn into_result ( self ) -> PResult < ' a , T > {
112
- match self {
113
- HasRecovered :: Recovered ( _, err) => Err ( err) ,
114
- HasRecovered :: Success ( t) => Ok ( t) ,
115
- }
116
- }
117
- }
118
-
119
75
/// How to parse a path.
120
76
#[ derive( Copy , Clone , PartialEq ) ]
121
77
pub enum PathStyle {
@@ -1411,7 +1367,6 @@ impl<'a> Parser<'a> {
1411
1367
debug ! ( "parse_trait_methods(): parsing provided method" ) ;
1412
1368
* at_end = true ;
1413
1369
let ( inner_attrs, body) = self . parse_inner_attrs_and_block ( ) ?;
1414
- let body = body. emit ( ) ;
1415
1370
attrs. extend ( inner_attrs. iter ( ) . cloned ( ) ) ;
1416
1371
Some ( body)
1417
1372
}
@@ -2447,7 +2402,7 @@ impl<'a> Parser<'a> {
2447
2402
let mut attrs = outer_attrs;
2448
2403
attrs. extend ( self . parse_inner_attributes ( ) ?) ;
2449
2404
2450
- let blk = self . parse_block_tail ( lo, blk_mode) ?. emit ( ) ;
2405
+ let blk = self . parse_block_tail ( lo, blk_mode) ?;
2451
2406
return Ok ( self . mk_expr ( blk. span , ExprKind :: Block ( blk) , attrs) ) ;
2452
2407
}
2453
2408
@@ -3204,7 +3159,7 @@ impl<'a> Parser<'a> {
3204
3159
3205
3160
let hi = self . prev_span ;
3206
3161
Ok ( self . mk_expr ( span_lo. to ( hi) ,
3207
- ExprKind :: ForLoop ( pat, expr, loop_block. emit ( ) , opt_ident) ,
3162
+ ExprKind :: ForLoop ( pat, expr, loop_block, opt_ident) ,
3208
3163
attrs) )
3209
3164
}
3210
3165
@@ -3217,7 +3172,6 @@ impl<'a> Parser<'a> {
3217
3172
}
3218
3173
let cond = self . parse_expr_res ( Restrictions :: NO_STRUCT_LITERAL , None ) ?;
3219
3174
let ( iattrs, body) = self . parse_inner_attrs_and_block ( ) ?;
3220
- let body = body. emit ( ) ;
3221
3175
attrs. extend ( iattrs) ;
3222
3176
let span = span_lo. to ( body. span ) ;
3223
3177
return Ok ( self . mk_expr ( span, ExprKind :: While ( cond, body, opt_ident) , attrs) ) ;
@@ -3233,7 +3187,6 @@ impl<'a> Parser<'a> {
3233
3187
let expr = self . parse_expr_res ( Restrictions :: NO_STRUCT_LITERAL , None ) ?;
3234
3188
let ( iattrs, body) = self . parse_inner_attrs_and_block ( ) ?;
3235
3189
attrs. extend ( iattrs) ;
3236
- let body = body. emit ( ) ;
3237
3190
let span = span_lo. to ( body. span ) ;
3238
3191
return Ok ( self . mk_expr ( span, ExprKind :: WhileLet ( pat, expr, body, opt_ident) , attrs) ) ;
3239
3192
}
@@ -3243,7 +3196,6 @@ impl<'a> Parser<'a> {
3243
3196
span_lo : Span ,
3244
3197
mut attrs : ThinVec < Attribute > ) -> PResult < ' a , P < Expr > > {
3245
3198
let ( iattrs, body) = self . parse_inner_attrs_and_block ( ) ?;
3246
- let body = body. emit ( ) ;
3247
3199
attrs. extend ( iattrs) ;
3248
3200
let span = span_lo. to ( body. span ) ;
3249
3201
Ok ( self . mk_expr ( span, ExprKind :: Loop ( body, opt_ident) , attrs) )
@@ -3254,7 +3206,6 @@ impl<'a> Parser<'a> {
3254
3206
-> PResult < ' a , P < Expr > >
3255
3207
{
3256
3208
let ( iattrs, body) = self . parse_inner_attrs_and_block ( ) ?;
3257
- let body = body. emit ( ) ;
3258
3209
attrs. extend ( iattrs) ;
3259
3210
Ok ( self . mk_expr ( span_lo. to ( body. span ) , ExprKind :: Catch ( body) , attrs) )
3260
3211
}
@@ -4301,14 +4252,14 @@ impl<'a> Parser<'a> {
4301
4252
return Err ( e) ;
4302
4253
}
4303
4254
4304
- Ok ( self . parse_block_tail ( lo, BlockCheckMode :: Default ) ?. emit ( ) )
4255
+ Ok ( self . parse_block_tail ( lo, BlockCheckMode :: Default ) ?)
4305
4256
}
4306
4257
4307
4258
/// Parse a block. Inner attrs are allowed.
4308
4259
fn parse_inner_attrs_and_block ( & mut self )
4309
- -> PResult < ' a , ( Vec < Attribute > , HasRecovered < ' a , P < Block > > ) >
4260
+ -> PResult < ' a , ( Vec < Attribute > , P < Block > ) >
4310
4261
{
4311
- maybe_whole ! ( self , NtBlock , |x| ( Vec :: new( ) , HasRecovered :: Success ( x ) ) ) ;
4262
+ maybe_whole ! ( self , NtBlock , |x| ( Vec :: new( ) , x ) ) ;
4312
4263
4313
4264
let lo = self . span ;
4314
4265
self . expect ( & token:: OpenDelim ( token:: Brace ) ) ?;
@@ -4319,15 +4270,14 @@ impl<'a> Parser<'a> {
4319
4270
/// Parse the rest of a block expression or function body
4320
4271
/// Precondition: already parsed the '{'.
4321
4272
fn parse_block_tail ( & mut self , lo : Span , s : BlockCheckMode )
4322
- -> PResult < ' a , HasRecovered < ' a , P < Block > > >
4273
+ -> PResult < ' a , P < Block > >
4323
4274
{
4324
4275
let mut stmts = vec ! [ ] ;
4325
4276
4326
- let mut error = None ;
4327
4277
while !self . eat ( & token:: CloseDelim ( token:: Brace ) ) {
4328
4278
let stmt = match self . parse_full_stmt ( false ) {
4329
- Err ( err) => {
4330
- error = Some ( err) ;
4279
+ Err ( mut err) => {
4280
+ err. emit ( ) ;
4331
4281
self . recover_stmt_ ( SemiColonMode :: Ignore , BlockMode :: Break ) ;
4332
4282
break ;
4333
4283
}
@@ -4342,14 +4292,12 @@ impl<'a> Parser<'a> {
4342
4292
continue ;
4343
4293
} ;
4344
4294
}
4345
- let block = HasRecovered :: new ( P ( ast:: Block {
4295
+ Ok ( P ( ast:: Block {
4346
4296
stmts,
4347
4297
id : ast:: DUMMY_NODE_ID ,
4348
4298
rules : s,
4349
4299
span : lo. to ( self . prev_span ) ,
4350
- } ) , error) ;
4351
-
4352
- Ok ( block)
4300
+ } ) )
4353
4301
}
4354
4302
4355
4303
/// Parse a statement, including the trailing semicolon.
@@ -4984,22 +4932,11 @@ impl<'a> Parser<'a> {
4984
4932
constness : Spanned < Constness > ,
4985
4933
abi : abi:: Abi )
4986
4934
-> PResult < ' a , ItemInfo > {
4987
-
4988
- self . parse_item_fn_recoverable ( unsafety, constness, abi) ?. into_result ( )
4989
- }
4990
-
4991
- fn parse_item_fn_recoverable ( & mut self ,
4992
- unsafety : Unsafety ,
4993
- constness : Spanned < Constness > ,
4994
- abi : abi:: Abi )
4995
- -> PResult < ' a , HasRecovered < ' a , ItemInfo > > {
4996
4935
let ( ident, mut generics) = self . parse_fn_header ( ) ?;
4997
4936
let decl = self . parse_fn_decl ( false ) ?;
4998
4937
generics. where_clause = self . parse_where_clause ( ) ?;
4999
4938
let ( inner_attrs, body) = self . parse_inner_attrs_and_block ( ) ?;
5000
- Ok ( body. map ( |body| ( ident,
5001
- ItemKind :: Fn ( decl, unsafety, constness, abi, generics, body) ,
5002
- Some ( inner_attrs) ) ) )
4939
+ Ok ( ( ident, ItemKind :: Fn ( decl, unsafety, constness, abi, generics, body) , Some ( inner_attrs) ) )
5003
4940
}
5004
4941
5005
4942
/// true if we are looking at `const ID`, false for things like `const fn` etc
@@ -5183,7 +5120,6 @@ impl<'a> Parser<'a> {
5183
5120
generics. where_clause = self . parse_where_clause ( ) ?;
5184
5121
* at_end = true ;
5185
5122
let ( inner_attrs, body) = self . parse_inner_attrs_and_block ( ) ?;
5186
- let body = body. into_result ( ) ?;
5187
5123
Ok ( ( ident, inner_attrs, generics, ast:: ImplItemKind :: Method ( ast:: MethodSig {
5188
5124
abi,
5189
5125
unsafety,
@@ -6369,49 +6305,31 @@ impl<'a> Parser<'a> {
6369
6305
let mut err = self . diagnostic ( )
6370
6306
. struct_span_err ( sp, "missing `struct` for struct definition" ) ;
6371
6307
err. span_suggestion_short ( sp, & msg, " struct " . into ( ) ) ;
6372
- err. emit ( ) ;
6373
- self . consume_block ( token:: Brace ) ;
6374
- let prev_span = self . prev_span ;
6375
- let item = self . mk_item ( lo. to ( prev_span) ,
6376
- ident,
6377
- ItemKind :: Placeholder ,
6378
- visibility,
6379
- vec ! [ ] ) ;
6380
- return Ok ( Some ( item) ) ;
6308
+ return Err ( err) ;
6381
6309
} else if self . look_ahead ( 1 , |t| * t == token:: OpenDelim ( token:: Paren ) ) {
6382
6310
let ident = self . parse_ident ( ) . unwrap ( ) ;
6383
6311
self . consume_block ( token:: Paren ) ;
6384
- let ( kw, ambiguous) = if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
6385
- self . consume_block ( token:: Brace ) ;
6386
- ( "fn" , false )
6312
+ let ( kw, kw_name, ambiguous) = if self . check ( & token:: RArrow ) ||
6313
+ self . check ( & token:: OpenDelim ( token:: Brace ) )
6314
+ {
6315
+ ( "fn" , "method" , false )
6387
6316
} else if self . check ( & token:: Colon ) {
6388
6317
let kw = "struct" ;
6389
- ( kw, false )
6318
+ ( kw, kw , false )
6390
6319
} else {
6391
- ( "fn` or `struct" , true )
6320
+ ( "fn` or `struct" , "method or struct" , true )
6392
6321
} ;
6393
6322
6394
- let msg = format ! ( "missing `{}`{}" , kw,
6395
- if ambiguous {
6396
- "" . to_string( )
6397
- } else {
6398
- format!( " for {} definition" , kw)
6399
- } ) ;
6323
+ let msg = format ! ( "missing `{}` for {} definition" , kw, kw_name) ;
6400
6324
let mut err = self . diagnostic ( ) . struct_span_err ( sp, & msg) ;
6401
6325
if !ambiguous {
6402
- let suggestion = format ! ( "add `{kw}` here to parse `{}` as a public {kw}" ,
6326
+ let suggestion = format ! ( "add `{}` here to parse `{}` as a public {}" ,
6327
+ kw,
6403
6328
ident,
6404
- kw=kw ) ;
6329
+ kw_name ) ;
6405
6330
err. span_suggestion_short ( sp, & suggestion, format ! ( " {} " , kw) ) ;
6406
6331
}
6407
- err. emit ( ) ;
6408
- let prev_span = self . prev_span ;
6409
- let item = self . mk_item ( lo. to ( prev_span) ,
6410
- ident,
6411
- ItemKind :: Placeholder ,
6412
- visibility,
6413
- vec ! [ ] ) ;
6414
- return Ok ( Some ( item) ) ;
6332
+ return Err ( err) ;
6415
6333
}
6416
6334
}
6417
6335
self . parse_macro_use_or_failure ( attrs, macros_allowed, attributes_allowed, lo, visibility)
0 commit comments