@@ -305,44 +305,39 @@ impl ast::Literal {
305305 . unwrap ( )
306306 }
307307
308+ fn find_suffix ( text : & str , possible_suffixes : & [ & str ] ) -> Option < SmolStr > {
309+ possible_suffixes
310+ . iter ( )
311+ . find ( |& suffix| text. ends_with ( suffix) )
312+ . map ( |& suffix| SmolStr :: new ( suffix) )
313+ }
314+
308315 pub fn kind ( & self ) -> LiteralKind {
309- match self . token ( ) . kind ( ) {
310- INT_NUMBER => {
311- let int_suffix_list = [
312- "isize" , "i128" , "i64" , "i32" , "i16" , "i8" , "usize" , "u128" , "u64" , "u32" ,
313- "u16" , "u8" ,
314- ] ;
316+ const INT_SUFFIXES : [ & ' static str ; 12 ] = [
317+ "u64" , "u32" , "u16" , "u8" , "usize" , "isize" , "i64" , "i32" , "i16" , "i8" , "u128" , "i128" ,
318+ ] ;
319+ const FLOAT_SUFFIXES : [ & ' static str ; 2 ] = [ "f32" , "f64" ] ;
315320
321+ let token = self . token ( ) ;
322+
323+ match token. kind ( ) {
324+ INT_NUMBER => {
325+ // FYI: there was a bug here previously, thus an if statement bellow is necessary.
316326 // The lexer treats e.g. `1f64` as an integer literal. See
317327 // https://github.com/rust-analyzer/rust-analyzer/issues/1592
318328 // and the comments on the linked PR.
319- let float_suffix_list = [ "f32" , "f64" ] ;
320-
321- let text = self . token ( ) . text ( ) . to_string ( ) ;
322329
323- let float_suffix = float_suffix_list
324- . iter ( )
325- . find ( |& s| text. ends_with ( s) )
326- . map ( |& suf| SmolStr :: new ( suf) ) ;
330+ let text = token. text ( ) ;
327331
328- if float_suffix . is_some ( ) {
329- LiteralKind :: FloatNumber { suffix : float_suffix }
332+ if let suffix @ Some ( _ ) = Self :: find_suffix ( & text , & FLOAT_SUFFIXES ) {
333+ LiteralKind :: FloatNumber { suffix }
330334 } else {
331- let suffix = int_suffix_list
332- . iter ( )
333- . find ( |& s| text. ends_with ( s) )
334- . map ( |& suf| SmolStr :: new ( suf) ) ;
335- LiteralKind :: IntNumber { suffix }
335+ LiteralKind :: IntNumber { suffix : Self :: find_suffix ( & text, & INT_SUFFIXES ) }
336336 }
337337 }
338338 FLOAT_NUMBER => {
339- let allowed_suffix_list = [ "f64" , "f32" ] ;
340- let text = self . token ( ) . text ( ) . to_string ( ) ;
341- let suffix = allowed_suffix_list
342- . iter ( )
343- . find ( |& s| text. ends_with ( s) )
344- . map ( |& suf| SmolStr :: new ( suf) ) ;
345- LiteralKind :: FloatNumber { suffix }
339+ let text = token. text ( ) ;
340+ LiteralKind :: FloatNumber { suffix : Self :: find_suffix ( & text, & FLOAT_SUFFIXES ) }
346341 }
347342 STRING | RAW_STRING => LiteralKind :: String ,
348343 T ! [ true ] | T ! [ false ] => LiteralKind :: Bool ,
0 commit comments