aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/syntax/src/ast/token_ext.rs40
1 files changed, 18 insertions, 22 deletions
diff --git a/crates/syntax/src/ast/token_ext.rs b/crates/syntax/src/ast/token_ext.rs
index ac0326420..754ca8c62 100644
--- a/crates/syntax/src/ast/token_ext.rs
+++ b/crates/syntax/src/ast/token_ext.rs
@@ -534,11 +534,6 @@ impl HasFormatSpecifier for ast::String {
534} 534}
535 535
536impl ast::IntNumber { 536impl 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 pub fn radix(&self) -> Radix { 537 pub fn radix(&self) -> Radix {
543 match self.text().get(..2).unwrap_or_default() { 538 match self.text().get(..2).unwrap_or_default() {
544 "0b" => Radix::Binary, 539 "0b" => Radix::Binary,
@@ -571,29 +566,30 @@ impl ast::IntNumber {
571 566
572 pub fn suffix(&self) -> Option<&str> { 567 pub fn suffix(&self) -> Option<&str> {
573 let text = self.text(); 568 let text = self.text();
574 // FIXME: don't check a fixed set of suffixes, `1_0_1_l_o_l` is valid 569 let radix = self.radix();
575 // syntax, suffix is `l_o_l`. 570 let mut indices = text.char_indices();
576 ast::IntNumber::SUFFIXES.iter().chain(ast::FloatNumber::SUFFIXES.iter()).find_map( 571 if radix != Radix::Decimal {
577 |suffix| { 572 indices.next()?;
578 if text.ends_with(suffix) { 573 indices.next()?;
579 return Some(&text[text.len() - suffix.len()..]); 574 }
580 } 575 let is_suffix_start: fn(&(usize, char)) -> bool = match radix {
581 None 576 Radix::Hexadecimal => |(_, c)| matches!(c, 'g'..='z' | 'G'..='Z'),
582 }, 577 _ => |(_, c)| c.is_ascii_alphabetic(),
583 ) 578 };
579 let (suffix_start, _) = indices.find(is_suffix_start)?;
580 Some(&text[suffix_start..])
584 } 581 }
585} 582}
586 583
587impl ast::FloatNumber { 584impl ast::FloatNumber {
588 const SUFFIXES: &'static [&'static str] = &["f32", "f64"];
589 pub fn suffix(&self) -> Option<&str> { 585 pub fn suffix(&self) -> Option<&str> {
590 let text = self.text(); 586 let text = self.text();
591 ast::FloatNumber::SUFFIXES.iter().find_map(|suffix| { 587 let mut indices = text.char_indices();
592 if text.ends_with(suffix) { 588 let (mut suffix_start, c) = indices.by_ref().find(|(_, c)| c.is_ascii_alphabetic())?;
593 return Some(&text[text.len() - suffix.len()..]); 589 if c == 'e' || c == 'E' {
594 } 590 suffix_start = indices.find(|(_, c)| c.is_ascii_alphabetic())?.0;
595 None 591 }
596 }) 592 Some(&text[suffix_start..])
597 } 593 }
598} 594}
599 595