@@ -394,6 +394,17 @@ impl<'a> Parser<'a> {
394
394
Parser :: token_to_string ( & self . token )
395
395
}
396
396
397
+ pub fn this_token_descr ( & self ) -> String {
398
+ let s = self . this_token_to_string ( ) ;
399
+ if self . token . is_strict_keyword ( ) {
400
+ format ! ( "keyword `{}`" , s)
401
+ } else if self . token . is_reserved_keyword ( ) {
402
+ format ! ( "reserved keyword `{}`" , s)
403
+ } else {
404
+ format ! ( "`{}`" , s)
405
+ }
406
+ }
407
+
397
408
pub fn unexpected_last < T > ( & self , t : & token:: Token ) -> PResult < ' a , T > {
398
409
let token_str = Parser :: token_to_string ( t) ;
399
410
let last_span = self . last_span ;
@@ -1466,7 +1477,7 @@ impl<'a> Parser<'a> {
1466
1477
self . parse_qualified_path ( PathStyle :: Type ) ?;
1467
1478
1468
1479
TyKind :: Path ( Some ( qself) , path)
1469
- } else if self . is_path_start ( ) {
1480
+ } else if self . token . is_path_start ( ) {
1470
1481
let path = self . parse_path ( PathStyle :: Type ) ?;
1471
1482
if self . check ( & token:: Not ) {
1472
1483
// MACRO INVOCATION
@@ -1485,9 +1496,8 @@ impl<'a> Parser<'a> {
1485
1496
// TYPE TO BE INFERRED
1486
1497
TyKind :: Infer
1487
1498
} else {
1488
- let this_token_str = self . this_token_to_string ( ) ;
1489
- let msg = format ! ( "expected type, found `{}`" , this_token_str) ;
1490
- return Err ( self . fatal ( & msg[ ..] ) ) ;
1499
+ let msg = format ! ( "expected type, found {}" , self . this_token_descr( ) ) ;
1500
+ return Err ( self . fatal ( & msg) ) ;
1491
1501
} ;
1492
1502
1493
1503
let sp = mk_sp ( lo, self . last_span . hi ) ;
@@ -1604,12 +1614,12 @@ impl<'a> Parser<'a> {
1604
1614
}
1605
1615
1606
1616
/// Matches token_lit = LIT_INTEGER | ...
1607
- pub fn lit_from_token ( & self , tok : & token :: Token ) -> PResult < ' a , LitKind > {
1608
- match * tok {
1617
+ pub fn parse_lit_token ( & mut self ) -> PResult < ' a , LitKind > {
1618
+ let out = match self . token {
1609
1619
token:: Interpolated ( token:: NtExpr ( ref v) ) => {
1610
1620
match v. node {
1611
- ExprKind :: Lit ( ref lit) => { Ok ( lit. node . clone ( ) ) }
1612
- _ => { return self . unexpected_last ( tok ) ; }
1621
+ ExprKind :: Lit ( ref lit) => { lit. node . clone ( ) }
1622
+ _ => { return self . unexpected_last ( & self . token ) ; }
1613
1623
}
1614
1624
}
1615
1625
token:: Literal ( lit, suf) => {
@@ -1624,13 +1634,13 @@ impl<'a> Parser<'a> {
1624
1634
( false , parse:: integer_lit ( & s. as_str ( ) ,
1625
1635
suf. as_ref ( ) . map ( |s| s. as_str ( ) ) ,
1626
1636
& self . sess . span_diagnostic ,
1627
- self . last_span ) )
1637
+ self . span ) )
1628
1638
}
1629
1639
token:: Float ( s) => {
1630
1640
( false , parse:: float_lit ( & s. as_str ( ) ,
1631
1641
suf. as_ref ( ) . map ( |s| s. as_str ( ) ) ,
1632
1642
& self . sess . span_diagnostic ,
1633
- self . last_span ) )
1643
+ self . span ) )
1634
1644
}
1635
1645
1636
1646
token:: Str_ ( s) => {
@@ -1652,14 +1662,17 @@ impl<'a> Parser<'a> {
1652
1662
} ;
1653
1663
1654
1664
if suffix_illegal {
1655
- let sp = self . last_span ;
1665
+ let sp = self . span ;
1656
1666
self . expect_no_suffix ( sp, & format ! ( "{} literal" , lit. short_name( ) ) , suf)
1657
1667
}
1658
1668
1659
- Ok ( out)
1669
+ out
1660
1670
}
1661
- _ => { return self . unexpected_last ( tok) ; }
1662
- }
1671
+ _ => { return self . unexpected_last ( & self . token ) ; }
1672
+ } ;
1673
+
1674
+ self . bump ( ) ;
1675
+ Ok ( out)
1663
1676
}
1664
1677
1665
1678
/// Matches lit = true | false | token_lit
@@ -1670,8 +1683,7 @@ impl<'a> Parser<'a> {
1670
1683
} else if self . eat_keyword ( keywords:: False ) {
1671
1684
LitKind :: Bool ( false )
1672
1685
} else {
1673
- let token = self . bump_and_get ( ) ;
1674
- let lit = self . lit_from_token ( & token) ?;
1686
+ let lit = self . parse_lit_token ( ) ?;
1675
1687
lit
1676
1688
} ;
1677
1689
Ok ( codemap:: Spanned { node : lit, span : mk_sp ( lo, self . last_span . hi ) } )
@@ -2338,7 +2350,7 @@ impl<'a> Parser<'a> {
2338
2350
let mut db = self . fatal ( "expected expression, found statement (`let`)" ) ;
2339
2351
db. note ( "variable declaration using `let` is a statement" ) ;
2340
2352
return Err ( db) ;
2341
- } else if self . is_path_start ( ) {
2353
+ } else if self . token . is_path_start ( ) {
2342
2354
let pth = self . parse_path ( PathStyle :: Expr ) ?;
2343
2355
2344
2356
// `!`, as an operator, is prefix, so we know this isn't that
@@ -2419,10 +2431,18 @@ impl<'a> Parser<'a> {
2419
2431
hi = pth. span . hi ;
2420
2432
ex = ExprKind :: Path ( None , pth) ;
2421
2433
} else {
2422
- // other literal expression
2423
- let lit = self . parse_lit ( ) ?;
2424
- hi = lit. span . hi ;
2425
- ex = ExprKind :: Lit ( P ( lit) ) ;
2434
+ match self . parse_lit ( ) {
2435
+ Ok ( lit) => {
2436
+ hi = lit. span . hi ;
2437
+ ex = ExprKind :: Lit ( P ( lit) ) ;
2438
+ }
2439
+ Err ( mut err) => {
2440
+ err. cancel ( ) ;
2441
+ let msg = format ! ( "expected expression, found {}" ,
2442
+ self . this_token_descr( ) ) ;
2443
+ return Err ( self . fatal ( & msg) ) ;
2444
+ }
2445
+ }
2426
2446
}
2427
2447
}
2428
2448
}
@@ -3567,7 +3587,7 @@ impl<'a> Parser<'a> {
3567
3587
}
3568
3588
3569
3589
fn parse_pat_range_end ( & mut self ) -> PResult < ' a , P < Expr > > {
3570
- if self . is_path_start ( ) {
3590
+ if self . token . is_path_start ( ) {
3571
3591
let lo = self . span . lo ;
3572
3592
let ( qself, path) = if self . eat_lt ( ) {
3573
3593
// Parse a qualified path
@@ -3585,12 +3605,6 @@ impl<'a> Parser<'a> {
3585
3605
}
3586
3606
}
3587
3607
3588
- fn is_path_start ( & self ) -> bool {
3589
- ( self . token == token:: Lt || self . token == token:: ModSep
3590
- || self . token . is_ident ( ) || self . token . is_path ( ) )
3591
- && !self . token . is_keyword ( keywords:: True ) && !self . token . is_keyword ( keywords:: False )
3592
- }
3593
-
3594
3608
/// Parse a pattern.
3595
3609
pub fn parse_pat ( & mut self ) -> PResult < ' a , P < Pat > > {
3596
3610
maybe_whole ! ( self , NtPat ) ;
@@ -3641,7 +3655,7 @@ impl<'a> Parser<'a> {
3641
3655
// Parse box pat
3642
3656
let subpat = self . parse_pat ( ) ?;
3643
3657
pat = PatKind :: Box ( subpat) ;
3644
- } else if self . is_path_start ( ) {
3658
+ } else if self . token . is_path_start ( ) {
3645
3659
// Parse pattern starting with a path
3646
3660
if self . token . is_ident ( ) && self . look_ahead ( 1 , |t| * t != token:: DotDotDot &&
3647
3661
* t != token:: OpenDelim ( token:: Brace ) &&
@@ -3731,12 +3745,20 @@ impl<'a> Parser<'a> {
3731
3745
}
3732
3746
} else {
3733
3747
// Try to parse everything else as literal with optional minus
3734
- let begin = self . parse_pat_literal_maybe_minus ( ) ?;
3735
- if self . eat ( & token:: DotDotDot ) {
3736
- let end = self . parse_pat_range_end ( ) ?;
3737
- pat = PatKind :: Range ( begin, end) ;
3738
- } else {
3739
- pat = PatKind :: Lit ( begin) ;
3748
+ match self . parse_pat_literal_maybe_minus ( ) {
3749
+ Ok ( begin) => {
3750
+ if self . eat ( & token:: DotDotDot ) {
3751
+ let end = self . parse_pat_range_end ( ) ?;
3752
+ pat = PatKind :: Range ( begin, end) ;
3753
+ } else {
3754
+ pat = PatKind :: Lit ( begin) ;
3755
+ }
3756
+ }
3757
+ Err ( mut err) => {
3758
+ err. cancel ( ) ;
3759
+ let msg = format ! ( "expected pattern, found {}" , self . this_token_descr( ) ) ;
3760
+ return Err ( self . fatal ( & msg) ) ;
3761
+ }
3740
3762
}
3741
3763
}
3742
3764
}
0 commit comments