@@ -49,7 +49,7 @@ enum DestructuredFloat {
4949 /// 1.2 | 1.2e3
5050 MiddleDot ( Symbol , Span , Span , Symbol , Span ) ,
5151 /// Invalid
52- Error ,
52+ Error ( ErrorGuaranteed ) ,
5353}
5454
5555impl < ' a > Parser < ' a > {
@@ -1008,7 +1008,7 @@ impl<'a> Parser<'a> {
10081008 self . mk_expr_tuple_field_access ( lo, ident1_span, base, sym1, None ) ;
10091009 self . mk_expr_tuple_field_access ( lo, ident2_span, base1, sym2, suffix)
10101010 }
1011- DestructuredFloat :: Error => base,
1011+ DestructuredFloat :: Error ( _ ) => base,
10121012 } )
10131013 }
10141014 _ => {
@@ -1018,7 +1018,7 @@ impl<'a> Parser<'a> {
10181018 }
10191019 }
10201020
1021- fn error_unexpected_after_dot ( & self ) {
1021+ fn error_unexpected_after_dot ( & self ) -> ErrorGuaranteed {
10221022 let actual = pprust:: token_to_string ( & self . token ) ;
10231023 let span = self . token . span ;
10241024 let sm = self . psess . source_map ( ) ;
@@ -1028,17 +1028,19 @@ impl<'a> Parser<'a> {
10281028 }
10291029 _ => ( span, actual) ,
10301030 } ;
1031- self . dcx ( ) . emit_err ( errors:: UnexpectedTokenAfterDot { span, actual } ) ;
1031+ self . dcx ( ) . emit_err ( errors:: UnexpectedTokenAfterDot { span, actual } )
10321032 }
10331033
1034- // We need an identifier or integer, but the next token is a float.
1035- // Break the float into components to extract the identifier or integer.
1034+ /// We need an identifier or integer, but the next token is a float.
1035+ /// Break the float into components to extract the identifier or integer.
1036+ ///
1037+ /// See also [`TokenKind::break_two_token_op`] which does similar splitting of `>>` into `>`.
1038+ //
10361039 // FIXME: With current `TokenCursor` it's hard to break tokens into more than 2
1037- // parts unless those parts are processed immediately. `TokenCursor` should either
1038- // support pushing "future tokens" (would be also helpful to `break_and_eat`), or
1039- // we should break everything including floats into more basic proc-macro style
1040- // tokens in the lexer (probably preferable).
1041- // See also `TokenKind::break_two_token_op` which does similar splitting of `>>` into `>`.
1040+ // parts unless those parts are processed immediately. `TokenCursor` should either
1041+ // support pushing "future tokens" (would be also helpful to `break_and_eat`), or
1042+ // we should break everything including floats into more basic proc-macro style
1043+ // tokens in the lexer (probably preferable).
10421044 fn break_up_float ( & self , float : Symbol , span : Span ) -> DestructuredFloat {
10431045 #[ derive( Debug ) ]
10441046 enum FloatComponent {
@@ -1078,34 +1080,30 @@ impl<'a> Parser<'a> {
10781080 DestructuredFloat :: Single ( Symbol :: intern ( i) , span)
10791081 }
10801082 // 1.
1081- [ IdentLike ( i) , Punct ( '.' ) ] => {
1082- let ( ident_span, dot_span) = if can_take_span_apart ( ) {
1083- let ( span, ident_len) = ( span. data ( ) , BytePos :: from_usize ( i. len ( ) ) ) ;
1084- let ident_span = span. with_hi ( span. lo + ident_len) ;
1085- let dot_span = span. with_lo ( span. lo + ident_len) ;
1086- ( ident_span, dot_span)
1083+ [ IdentLike ( left) , Punct ( '.' ) ] => {
1084+ let ( left_span, dot_span) = if can_take_span_apart ( ) {
1085+ let left_span = span. with_hi ( span. lo ( ) + BytePos :: from_usize ( left. len ( ) ) ) ;
1086+ let dot_span = span. with_lo ( left_span. hi ( ) ) ;
1087+ ( left_span, dot_span)
10871088 } else {
10881089 ( span, span)
10891090 } ;
1090- let symbol = Symbol :: intern ( i ) ;
1091- DestructuredFloat :: TrailingDot ( symbol , ident_span , dot_span)
1091+ let left = Symbol :: intern ( left ) ;
1092+ DestructuredFloat :: TrailingDot ( left , left_span , dot_span)
10921093 }
10931094 // 1.2 | 1.2e3
1094- [ IdentLike ( i1) , Punct ( '.' ) , IdentLike ( i2) ] => {
1095- let ( ident1_span, dot_span, ident2_span) = if can_take_span_apart ( ) {
1096- let ( span, ident1_len) = ( span. data ( ) , BytePos :: from_usize ( i1. len ( ) ) ) ;
1097- let ident1_span = span. with_hi ( span. lo + ident1_len) ;
1098- let dot_span = span
1099- . with_lo ( span. lo + ident1_len)
1100- . with_hi ( span. lo + ident1_len + BytePos ( 1 ) ) ;
1101- let ident2_span = self . token . span . with_lo ( span. lo + ident1_len + BytePos ( 1 ) ) ;
1102- ( ident1_span, dot_span, ident2_span)
1095+ [ IdentLike ( left) , Punct ( '.' ) , IdentLike ( right) ] => {
1096+ let ( left_span, dot_span, right_span) = if can_take_span_apart ( ) {
1097+ let left_span = span. with_hi ( span. lo ( ) + BytePos :: from_usize ( left. len ( ) ) ) ;
1098+ let dot_span = span. with_lo ( left_span. hi ( ) ) . with_hi ( left_span. hi ( ) + BytePos ( 1 ) ) ;
1099+ let right_span = span. with_lo ( dot_span. hi ( ) ) ;
1100+ ( left_span, dot_span, right_span)
11031101 } else {
11041102 ( span, span, span)
11051103 } ;
1106- let symbol1 = Symbol :: intern ( i1 ) ;
1107- let symbol2 = Symbol :: intern ( i2 ) ;
1108- DestructuredFloat :: MiddleDot ( symbol1 , ident1_span , dot_span, symbol2 , ident2_span )
1104+ let left = Symbol :: intern ( left ) ;
1105+ let right = Symbol :: intern ( right ) ;
1106+ DestructuredFloat :: MiddleDot ( left , left_span , dot_span, right , right_span )
11091107 }
11101108 // 1e+ | 1e- (recovered)
11111109 [ IdentLike ( _) , Punct ( '+' | '-' ) ] |
@@ -1116,8 +1114,8 @@ impl<'a> Parser<'a> {
11161114 // 1.2e+3 | 1.2e-3
11171115 [ IdentLike ( _) , Punct ( '.' ) , IdentLike ( _) , Punct ( '+' | '-' ) , IdentLike ( _) ] => {
11181116 // See the FIXME about `TokenCursor` above.
1119- self . error_unexpected_after_dot ( ) ;
1120- DestructuredFloat :: Error
1117+ let guar = self . error_unexpected_after_dot ( ) ;
1118+ DestructuredFloat :: Error ( guar )
11211119 }
11221120 _ => panic ! ( "unexpected components in a float token: {components:?}" ) ,
11231121 }
@@ -1183,7 +1181,7 @@ impl<'a> Parser<'a> {
11831181 fields. insert ( start_idx, Ident :: new ( symbol2, span2) ) ;
11841182 fields. insert ( start_idx, Ident :: new ( symbol1, span1) ) ;
11851183 }
1186- DestructuredFloat :: Error => {
1184+ DestructuredFloat :: Error ( _ ) => {
11871185 trailing_dot = None ;
11881186 fields. insert ( start_idx, Ident :: new ( symbol, self . prev_token . span ) ) ;
11891187 }
0 commit comments