diff --git a/crates/oxc_ast/src/ast_impl/literal.rs b/crates/oxc_ast/src/ast_impl/literal.rs index 392bdacab7a2e..676a4734b5c98 100644 --- a/crates/oxc_ast/src/ast_impl/literal.rs +++ b/crates/oxc_ast/src/ast_impl/literal.rs @@ -100,6 +100,41 @@ impl fmt::Display for NumericLiteral<'_> { } } +impl StringLiteral<'_> { + /// Static Semantics: `IsStringWellFormedUnicode` + /// test for \uD800-\uDFFF + /// + /// See: + pub fn is_string_well_formed_unicode(&self) -> bool { + let mut chars = self.value.chars(); + while let Some(c) = chars.next() { + if c == '\\' && chars.next() == Some('u') { + let hex = &chars.as_str()[..4]; + if let Ok(hex) = u32::from_str_radix(hex, 16) { + if (0xd800..=0xdfff).contains(&hex) { + return false; + } + }; + } + } + true + } +} + +impl AsRef for StringLiteral<'_> { + #[inline] + fn as_ref(&self) -> &str { + self.value.as_ref() + } +} + +impl fmt::Display for StringLiteral<'_> { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.value.fmt(f) + } +} + impl BigIntLiteral<'_> { /// Is this BigInt literal zero? (`0n`). pub fn is_zero(&self) -> bool { @@ -262,38 +297,3 @@ impl fmt::Display for RegExpFlags { Ok(()) } } - -impl StringLiteral<'_> { - /// Static Semantics: `IsStringWellFormedUnicode` - /// test for \uD800-\uDFFF - /// - /// See: - pub fn is_string_well_formed_unicode(&self) -> bool { - let mut chars = self.value.chars(); - while let Some(c) = chars.next() { - if c == '\\' && chars.next() == Some('u') { - let hex = &chars.as_str()[..4]; - if let Ok(hex) = u32::from_str_radix(hex, 16) { - if (0xd800..=0xdfff).contains(&hex) { - return false; - } - }; - } - } - true - } -} - -impl AsRef for StringLiteral<'_> { - #[inline] - fn as_ref(&self) -> &str { - self.value.as_ref() - } -} - -impl fmt::Display for StringLiteral<'_> { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.value.fmt(f) - } -}