Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/syntax/src/ast/token_ext.rs')
| -rw-r--r-- | crates/syntax/src/ast/token_ext.rs | 90 |
1 files changed, 50 insertions, 40 deletions
diff --git a/crates/syntax/src/ast/token_ext.rs b/crates/syntax/src/ast/token_ext.rs index ede392fc62..b39006e2ff 100644 --- a/crates/syntax/src/ast/token_ext.rs +++ b/crates/syntax/src/ast/token_ext.rs @@ -1,6 +1,9 @@ //! There are many AstNodes, but only a few tokens, so we hand-write them here. -use std::borrow::Cow; +use std::{ + borrow::Cow, + num::{ParseFloatError, ParseIntError}, +}; use rustc_lexer::unescape::{ unescape_byte, unescape_c_string, unescape_char, unescape_literal, CStrUnit, Mode, @@ -391,10 +394,9 @@ impl ast::IntNumber { (prefix, text, suffix) } - pub fn value(&self) -> Option<u128> { + pub fn value(&self) -> Result<u128, ParseIntError> { let (_, text, _) = self.split_into_parts(); - let value = u128::from_str_radix(&text.replace('_', ""), self.radix() as u32).ok()?; - Some(value) + u128::from_str_radix(&text.replace('_', ""), self.radix() as u32) } pub fn suffix(&self) -> Option<&str> { @@ -445,9 +447,14 @@ impl ast::FloatNumber { } } - pub fn value(&self) -> Option<f64> { + pub fn value(&self) -> Result<f64, ParseFloatError> { let (text, _) = self.split_into_parts(); - text.replace('_', "").parse::<f64>().ok() + text.replace('_', "").parse::<f64>() + } + + pub fn value_f32(&self) -> Result<f32, ParseFloatError> { + let (text, _) = self.split_into_parts(); + text.replace('_', "").parse::<f32>() } } @@ -471,6 +478,38 @@ impl Radix { } } +impl ast::Char { + pub fn value(&self) -> Option<char> { + let mut text = self.text(); + if text.starts_with('\'') { + text = &text[1..]; + } else { + return None; + } + if text.ends_with('\'') { + text = &text[0..text.len() - 1]; + } + + unescape_char(text).ok() + } +} + +impl ast::Byte { + pub fn value(&self) -> Option<u8> { + let mut text = self.text(); + if text.starts_with("b\'") { + text = &text[2..]; + } else { + return None; + } + if text.ends_with('\'') { + text = &text[0..text.len() - 1]; + } + + unescape_byte(text).ok() + } +} + #[cfg(test)] mod tests { use crate::ast::{self, make, FloatNumber, IntNumber}; @@ -484,12 +523,15 @@ mod tests { } fn check_float_value(lit: &str, expected: impl Into<Option<f64>> + Copy) { - assert_eq!(FloatNumber { syntax: make::tokens::literal(lit) }.value(), expected.into()); + assert_eq!( + FloatNumber { syntax: make::tokens::literal(lit) }.value().ok(), + expected.into() + ); assert_eq!(IntNumber { syntax: make::tokens::literal(lit) }.float_value(), expected.into()); } fn check_int_value(lit: &str, expected: impl Into<Option<u128>>) { - assert_eq!(IntNumber { syntax: make::tokens::literal(lit) }.value(), expected.into()); + assert_eq!(IntNumber { syntax: make::tokens::literal(lit) }.value().ok(), expected.into()); } #[test] @@ -569,35 +611,3 @@ bcde", b"abcde", check_int_value("1_1_1_1_1_1", 111111); } } - -impl ast::Char { - pub fn value(&self) -> Option<char> { - let mut text = self.text(); - if text.starts_with('\'') { - text = &text[1..]; - } else { - return None; - } - if text.ends_with('\'') { - text = &text[0..text.len() - 1]; - } - - unescape_char(text).ok() - } -} - -impl ast::Byte { - pub fn value(&self) -> Option<u8> { - let mut text = self.text(); - if text.starts_with("b\'") { - text = &text[2..]; - } else { - return None; - } - if text.ends_with('\'') { - text = &text[0..text.len() - 1]; - } - - unescape_byte(text).ok() - } -} |