diff --git a/crates/oxc_ecmascript/src/lib.rs b/crates/oxc_ecmascript/src/lib.rs index eda232334fe4f..0a259fe1b0b77 100644 --- a/crates/oxc_ecmascript/src/lib.rs +++ b/crates/oxc_ecmascript/src/lib.rs @@ -11,6 +11,7 @@ mod string_char_at; mod string_index_of; mod string_last_index_of; mod string_to_big_int; +mod string_to_number; mod to_big_int; mod to_boolean; mod to_int_32; @@ -28,6 +29,6 @@ pub use self::{ private_bound_identifiers::PrivateBoundIdentifiers, prop_name::PropName, string_char_at::StringCharAt, string_index_of::StringIndexOf, string_last_index_of::StringLastIndexOf, string_to_big_int::StringToBigInt, - to_big_int::ToBigInt, to_boolean::ToBoolean, to_int_32::ToInt32, to_number::ToNumber, - to_string::ToJsString, + string_to_number::StringToNumber, to_big_int::ToBigInt, to_boolean::ToBoolean, + to_int_32::ToInt32, to_number::ToNumber, to_string::ToJsString, }; diff --git a/crates/oxc_ecmascript/src/string_to_number.rs b/crates/oxc_ecmascript/src/string_to_number.rs new file mode 100644 index 0000000000000..5af9ddc3831a7 --- /dev/null +++ b/crates/oxc_ecmascript/src/string_to_number.rs @@ -0,0 +1,9 @@ +pub trait StringToNumber { + fn string_to_number(&self) -> f64; +} + +impl StringToNumber for &str { + fn string_to_number(&self) -> f64 { + self.parse::().unwrap_or(f64::NAN) + } +} diff --git a/crates/oxc_ecmascript/src/to_number.rs b/crates/oxc_ecmascript/src/to_number.rs index 8aeacd2555643..6aa905a404f92 100644 --- a/crates/oxc_ecmascript/src/to_number.rs +++ b/crates/oxc_ecmascript/src/to_number.rs @@ -25,9 +25,9 @@ impl<'a> ToNumber<'a> for Expression<'a> { "NaN" | "undefined" => Some(f64::NAN), _ => None, }, - // TODO: StringToNumber - Expression::StringLiteral(string_literal) => { - string_literal.value.parse::().map_or(Some(f64::NAN), Some) + Expression::StringLiteral(lit) => { + use crate::StringToNumber; + Some(lit.value.as_str().string_to_number()) } _ => None, }