@@ -1487,7 +1487,10 @@ impl<'a> Parser<'a> {
1487
1487
}
1488
1488
_ => {
1489
1489
let token_str = self . this_token_to_string ( ) ;
1490
- return Err ( self . fatal ( & format ! ( "expected `;` or `{{`, found `{}`" , token_str) ) ) ;
1490
+ let mut err = self . fatal ( & format ! ( "expected `;` or `{{`, found `{}`" ,
1491
+ token_str) ) ;
1492
+ err. span_label ( self . span , "expected `;` or `{`" ) ;
1493
+ return Err ( err) ;
1491
1494
}
1492
1495
} ;
1493
1496
( ident, ast:: TraitItemKind :: Method ( sig, body) , generics)
@@ -2218,7 +2221,12 @@ impl<'a> Parser<'a> {
2218
2221
TokenTree :: Delimited ( _, delimited) => Ok ( ( delim, delimited. stream ( ) . into ( ) ) ) ,
2219
2222
_ => unreachable ! ( ) ,
2220
2223
} ,
2221
- _ => Err ( self . fatal ( "expected open delimiter" ) ) ,
2224
+ _ => {
2225
+ let msg = "expected open delimiter" ;
2226
+ let mut err = self . fatal ( msg) ;
2227
+ err. span_label ( self . span , msg) ;
2228
+ Err ( err)
2229
+ }
2222
2230
}
2223
2231
}
2224
2232
@@ -2351,7 +2359,10 @@ impl<'a> Parser<'a> {
2351
2359
if self . eat_keyword ( keywords:: Loop ) {
2352
2360
return self . parse_loop_expr ( Some ( label) , lo, attrs)
2353
2361
}
2354
- return Err ( self . fatal ( "expected `while`, `for`, or `loop` after a label" ) )
2362
+ let msg = "expected `while`, `for`, or `loop` after a label" ;
2363
+ let mut err = self . fatal ( msg) ;
2364
+ err. span_label ( self . span , msg) ;
2365
+ return Err ( err) ;
2355
2366
}
2356
2367
if self . eat_keyword ( keywords:: Loop ) {
2357
2368
let lo = self . prev_span ;
@@ -2410,6 +2421,7 @@ impl<'a> Parser<'a> {
2410
2421
// Catch this syntax error here, instead of in `parse_ident`, so
2411
2422
// that we can explicitly mention that let is not to be used as an expression
2412
2423
let mut db = self . fatal ( "expected expression, found statement (`let`)" ) ;
2424
+ db. span_label ( self . span , "expected expression" ) ;
2413
2425
db. note ( "variable declaration using `let` is a statement" ) ;
2414
2426
return Err ( db) ;
2415
2427
} else if self . token . is_path_start ( ) {
@@ -2445,7 +2457,9 @@ impl<'a> Parser<'a> {
2445
2457
self . cancel ( & mut err) ;
2446
2458
let msg = format ! ( "expected expression, found {}" ,
2447
2459
self . this_token_descr( ) ) ;
2448
- return Err ( self . fatal ( & msg) ) ;
2460
+ let mut err = self . fatal ( & msg) ;
2461
+ err. span_label ( self . span , "expected expression" ) ;
2462
+ return Err ( err) ;
2449
2463
}
2450
2464
}
2451
2465
}
@@ -2735,7 +2749,9 @@ impl<'a> Parser<'a> {
2735
2749
self . look_ahead ( 1 , |t| t. is_ident ( ) ) => {
2736
2750
self . bump ( ) ;
2737
2751
let name = match self . token { token:: Ident ( ident) => ident, _ => unreachable ! ( ) } ;
2738
- self . fatal ( & format ! ( "unknown macro variable `{}`" , name) ) . emit ( ) ;
2752
+ let mut err = self . fatal ( & format ! ( "unknown macro variable `{}`" , name) ) ;
2753
+ err. span_label ( self . span , "unknown macro variable" ) ;
2754
+ err. emit ( ) ;
2739
2755
return
2740
2756
}
2741
2757
token:: Interpolated ( ref nt) => {
@@ -3760,7 +3776,10 @@ impl<'a> Parser<'a> {
3760
3776
self . expect_and ( ) ?;
3761
3777
let mutbl = self . parse_mutability ( ) ;
3762
3778
if let token:: Lifetime ( ident) = self . token {
3763
- return Err ( self . fatal ( & format ! ( "unexpected lifetime `{}` in pattern" , ident) ) ) ;
3779
+ let mut err = self . fatal ( & format ! ( "unexpected lifetime `{}` in pattern" ,
3780
+ ident) ) ;
3781
+ err. span_label ( self . span , "unexpected lifetime" ) ;
3782
+ return Err ( err) ;
3764
3783
}
3765
3784
let subpat = self . parse_pat ( ) ?;
3766
3785
pat = PatKind :: Ref ( subpat, mutbl) ;
@@ -3843,7 +3862,10 @@ impl<'a> Parser<'a> {
3843
3862
}
3844
3863
token:: OpenDelim ( token:: Brace ) => {
3845
3864
if qself. is_some ( ) {
3846
- return Err ( self . fatal ( "unexpected `{` after qualified path" ) ) ;
3865
+ let msg = "unexpected `{` after qualified path" ;
3866
+ let mut err = self . fatal ( msg) ;
3867
+ err. span_label ( self . span , msg) ;
3868
+ return Err ( err) ;
3847
3869
}
3848
3870
// Parse struct pattern
3849
3871
self . bump ( ) ;
@@ -3857,7 +3879,10 @@ impl<'a> Parser<'a> {
3857
3879
}
3858
3880
token:: OpenDelim ( token:: Paren ) => {
3859
3881
if qself. is_some ( ) {
3860
- return Err ( self . fatal ( "unexpected `(` after qualified path" ) ) ;
3882
+ let msg = "unexpected `(` after qualified path" ;
3883
+ let mut err = self . fatal ( msg) ;
3884
+ err. span_label ( self . span , msg) ;
3885
+ return Err ( err) ;
3861
3886
}
3862
3887
// Parse tuple struct or enum pattern
3863
3888
self . bump ( ) ;
@@ -3889,7 +3914,9 @@ impl<'a> Parser<'a> {
3889
3914
Err ( mut err) => {
3890
3915
self . cancel ( & mut err) ;
3891
3916
let msg = format ! ( "expected pattern, found {}" , self . this_token_descr( ) ) ;
3892
- return Err ( self . fatal ( & msg) ) ;
3917
+ let mut err = self . fatal ( & msg) ;
3918
+ err. span_label ( self . span , "expected pattern" ) ;
3919
+ return Err ( err) ;
3893
3920
}
3894
3921
}
3895
3922
}
@@ -4289,9 +4316,11 @@ impl<'a> Parser<'a> {
4289
4316
""
4290
4317
} ;
4291
4318
let tok_str = self . this_token_to_string ( ) ;
4292
- return Err ( self . fatal ( & format ! ( "expected {}`(` or `{{`, found `{}`" ,
4293
- ident_str,
4294
- tok_str) ) )
4319
+ let mut err = self . fatal ( & format ! ( "expected {}`(` or `{{`, found `{}`" ,
4320
+ ident_str,
4321
+ tok_str) ) ;
4322
+ err. span_label ( self . span , format ! ( "expected {}`(` or `{{`" , ident_str) ) ;
4323
+ return Err ( err)
4295
4324
} ,
4296
4325
} ;
4297
4326
@@ -5598,8 +5627,12 @@ impl<'a> Parser<'a> {
5598
5627
body
5599
5628
} else {
5600
5629
let token_str = self . this_token_to_string ( ) ;
5601
- return Err ( self . fatal ( & format ! ( "expected `where`, `{{`, `(`, or `;` after struct \
5602
- name, found `{}`", token_str) ) )
5630
+ let mut err = self . fatal ( & format ! (
5631
+ "expected `where`, `{{`, `(`, or `;` after struct name, found `{}`" ,
5632
+ token_str
5633
+ ) ) ;
5634
+ err. span_label ( self . span , "expected `where`, `{`, `(`, or `;` after struct name" ) ;
5635
+ return Err ( err) ;
5603
5636
} ;
5604
5637
5605
5638
Ok ( ( class_name, ItemKind :: Struct ( vdata, generics) , None ) )
@@ -5618,8 +5651,10 @@ impl<'a> Parser<'a> {
5618
5651
VariantData :: Struct ( self . parse_record_struct_body ( ) ?, ast:: DUMMY_NODE_ID )
5619
5652
} else {
5620
5653
let token_str = self . this_token_to_string ( ) ;
5621
- return Err ( self . fatal ( & format ! ( "expected `where` or `{{` after union \
5622
- name, found `{}`", token_str) ) )
5654
+ let mut err = self . fatal ( & format ! (
5655
+ "expected `where` or `{{` after union name, found `{}`" , token_str) ) ;
5656
+ err. span_label ( self . span , "expected `where` or `{` after union name" ) ;
5657
+ return Err ( err) ;
5623
5658
} ;
5624
5659
5625
5660
Ok ( ( class_name, ItemKind :: Union ( vdata, generics) , None ) )
@@ -5666,9 +5701,10 @@ impl<'a> Parser<'a> {
5666
5701
self . eat ( & token:: CloseDelim ( token:: Brace ) ) ;
5667
5702
} else {
5668
5703
let token_str = self . this_token_to_string ( ) ;
5669
- return Err ( self . fatal ( & format ! ( "expected `where`, or `{{` after struct \
5670
- name, found `{}`",
5671
- token_str) ) ) ;
5704
+ let mut err = self . fatal ( & format ! (
5705
+ "expected `where`, or `{{` after struct name, found `{}`" , token_str) ) ;
5706
+ err. span_label ( self . span , "expected `where`, or `{` after struct name" ) ;
5707
+ return Err ( err) ;
5672
5708
}
5673
5709
5674
5710
Ok ( fields)
@@ -5841,9 +5877,11 @@ impl<'a> Parser<'a> {
5841
5877
if !self . eat ( term) {
5842
5878
let token_str = self . this_token_to_string ( ) ;
5843
5879
let mut err = self . fatal ( & format ! ( "expected item, found `{}`" , token_str) ) ;
5844
- let msg = "consider removing this semicolon" ;
5845
5880
if token_str == ";" {
5881
+ let msg = "consider removing this semicolon" ;
5846
5882
err. span_suggestion_short ( self . span , msg, "" . to_string ( ) ) ;
5883
+ } else {
5884
+ err. span_label ( self . span , "expected item" ) ;
5847
5885
}
5848
5886
return Err ( err) ;
5849
5887
}
@@ -7000,7 +7038,12 @@ impl<'a> Parser<'a> {
7000
7038
self . expect_no_suffix ( sp, "string literal" , suf) ;
7001
7039
Ok ( ( s, style) )
7002
7040
}
7003
- _ => Err ( self . fatal ( "expected string literal" ) )
7041
+ _ => {
7042
+ let msg = "expected string literal" ;
7043
+ let mut err = self . fatal ( msg) ;
7044
+ err. span_label ( self . span , msg) ;
7045
+ Err ( err)
7046
+ }
7004
7047
}
7005
7048
}
7006
7049
}
0 commit comments