@@ -534,11 +534,6 @@ impl HasFormatSpecifier for ast::String {
534
534
}
535
535
536
536
impl ast:: IntNumber {
537
- const SUFFIXES : & ' static [ & ' static str ] = & [
538
- "u8" , "u16" , "u32" , "u64" , "u128" , "usize" , // Unsigned.
539
- "i8" , "i16" , "i32" , "i64" , "i128" , "isize" , // Signed.
540
- ] ;
541
-
542
537
pub fn radix ( & self ) -> Radix {
543
538
match self . text ( ) . get ( ..2 ) . unwrap_or_default ( ) {
544
539
"0b" => Radix :: Binary ,
@@ -571,29 +566,30 @@ impl ast::IntNumber {
571
566
572
567
pub fn suffix ( & self ) -> Option < & str > {
573
568
let text = self . text ( ) ;
574
- // FIXME: don't check a fixed set of suffixes, `1_0_1_l_o_l` is valid
575
- // syntax, suffix is `l_o_l`.
576
- ast:: IntNumber :: SUFFIXES . iter ( ) . chain ( ast:: FloatNumber :: SUFFIXES . iter ( ) ) . find_map (
577
- |suffix| {
578
- if text. ends_with ( suffix) {
579
- return Some ( & text[ text. len ( ) - suffix. len ( ) ..] ) ;
580
- }
581
- None
582
- } ,
583
- )
569
+ let radix = self . radix ( ) ;
570
+ let mut indices = text. char_indices ( ) ;
571
+ if radix != Radix :: Decimal {
572
+ indices. next ( ) ?;
573
+ indices. next ( ) ?;
574
+ }
575
+ let is_suffix_start: fn ( & ( usize , char ) ) -> bool = match radix {
576
+ Radix :: Hexadecimal => |( _, c) | matches ! ( c, 'g' ..='z' | 'G' ..='Z' ) ,
577
+ _ => |( _, c) | c. is_ascii_alphabetic ( ) ,
578
+ } ;
579
+ let ( suffix_start, _) = indices. find ( is_suffix_start) ?;
580
+ Some ( & text[ suffix_start..] )
584
581
}
585
582
}
586
583
587
584
impl ast:: FloatNumber {
588
- const SUFFIXES : & ' static [ & ' static str ] = & [ "f32" , "f64" ] ;
589
585
pub fn suffix ( & self ) -> Option < & str > {
590
586
let text = self . text ( ) ;
591
- ast :: FloatNumber :: SUFFIXES . iter ( ) . find_map ( |suffix| {
592
- if text . ends_with ( suffix ) {
593
- return Some ( & text [ text . len ( ) - suffix . len ( ) .. ] ) ;
594
- }
595
- None
596
- } )
587
+ let mut indices = text . char_indices ( ) ;
588
+ let ( mut suffix_start , c ) = indices . by_ref ( ) . find ( | ( _ , c ) | c . is_ascii_alphabetic ( ) ) ? ;
589
+ if c == 'e' || c == 'E' {
590
+ suffix_start = indices . find ( | ( _ , c ) | c . is_ascii_alphabetic ( ) ) ? . 0 ;
591
+ }
592
+ Some ( & text [ suffix_start.. ] )
597
593
}
598
594
}
599
595
0 commit comments