@@ -778,13 +778,12 @@ impl<'a> Parser<'a> {
778
778
779
779
macro_rules! parse_lit {
780
780
( ) => {
781
- match self . parse_lit ( ) {
782
- Ok ( literal) => {
781
+ match self . parse_opt_lit ( ) {
782
+ Some ( literal) => {
783
783
hi = self . prev_span;
784
784
ex = ExprKind :: Lit ( literal) ;
785
785
}
786
- Err ( mut err) => {
787
- err. cancel( ) ;
786
+ None => {
788
787
return Err ( self . expected_expression_found( ) ) ;
789
788
}
790
789
}
@@ -1074,11 +1073,20 @@ impl<'a> Parser<'a> {
1074
1073
self . maybe_recover_from_bad_qpath ( expr, true )
1075
1074
}
1076
1075
1077
- /// Matches `lit = true | false | token_lit`.
1078
1076
pub ( super ) fn parse_lit ( & mut self ) -> PResult < ' a , Lit > {
1077
+ self . parse_opt_lit ( ) . ok_or_else ( || {
1078
+ let msg = format ! ( "unexpected token: {}" , self . this_token_descr( ) ) ;
1079
+ self . span_fatal ( self . token . span , & msg)
1080
+ } )
1081
+ }
1082
+
1083
+ /// Matches `lit = true | false | token_lit`.
1084
+ /// Returns `None` if the next token is not a literal.
1085
+ pub ( super ) fn parse_opt_lit ( & mut self ) -> Option < Lit > {
1079
1086
let mut recovered = None ;
1080
1087
if self . token == token:: Dot {
1081
- // Attempt to recover `.4` as `0.4`.
1088
+ // Attempt to recover `.4` as `0.4`. We don't currently have any syntax where
1089
+ // dot would follow an optional literal, so we do this unconditionally.
1082
1090
recovered = self . look_ahead ( 1 , |next_token| {
1083
1091
if let token:: Literal ( token:: Lit { kind : token:: Integer , symbol, suffix } )
1084
1092
= next_token. kind {
@@ -1107,11 +1115,10 @@ impl<'a> Parser<'a> {
1107
1115
match Lit :: from_token ( token) {
1108
1116
Ok ( lit) => {
1109
1117
self . bump ( ) ;
1110
- Ok ( lit)
1118
+ Some ( lit)
1111
1119
}
1112
1120
Err ( LitError :: NotLiteral ) => {
1113
- let msg = format ! ( "unexpected token: {}" , self . this_token_descr( ) ) ;
1114
- Err ( self . span_fatal ( token. span , & msg) )
1121
+ None
1115
1122
}
1116
1123
Err ( err) => {
1117
1124
let span = token. span ;
@@ -1120,18 +1127,18 @@ impl<'a> Parser<'a> {
1120
1127
_ => unreachable ! ( ) ,
1121
1128
} ;
1122
1129
self . bump ( ) ;
1123
- self . error_literal_from_token ( err, lit, span) ;
1130
+ self . report_lit_error ( err, lit, span) ;
1124
1131
// Pack possible quotes and prefixes from the original literal into
1125
1132
// the error literal's symbol so they can be pretty-printed faithfully.
1126
1133
let suffixless_lit = token:: Lit :: new ( lit. kind , lit. symbol , None ) ;
1127
1134
let symbol = Symbol :: intern ( & suffixless_lit. to_string ( ) ) ;
1128
1135
let lit = token:: Lit :: new ( token:: Err , symbol, lit. suffix ) ;
1129
- Lit :: from_lit_token ( lit, span) . map_err ( |_| unreachable ! ( ) )
1136
+ Some ( Lit :: from_lit_token ( lit, span) . unwrap_or_else ( |_| unreachable ! ( ) ) )
1130
1137
}
1131
1138
}
1132
1139
}
1133
1140
1134
- fn error_literal_from_token ( & self , err : LitError , lit : token:: Lit , span : Span ) {
1141
+ fn report_lit_error ( & self , err : LitError , lit : token:: Lit , span : Span ) {
1135
1142
// Checks if `s` looks like i32 or u1234 etc.
1136
1143
fn looks_like_width_suffix ( first_chars : & [ char ] , s : & str ) -> bool {
1137
1144
s. len ( ) > 1
0 commit comments