use unicode_id_start::{is_id_continue_unicode, is_id_start_unicode};
pub const EOF: char = '\0';
pub const ZWNJ: char = '\u{200c}';
pub const ZWJ: char = '\u{200d}';
pub const ZWNBSP: char = '\u{feff}';
pub const TAB: char = '\u{9}';
pub const VT: char = '\u{b}';
pub const FF: char = '\u{c}';
pub const NBSP: char = '\u{a0}';
pub fn is_irregular_whitespace(c: char) -> bool {
matches!(
c,
VT | FF | NBSP | ZWNBSP | '\u{85}' | '\u{1680}' | '\u{2000}'
..='\u{200a}' | '\u{202f}' | '\u{205f}' | '\u{3000}'
)
}
pub const LF: char = '\u{a}';
pub const CR: char = '\u{d}';
pub const LS: char = '\u{2028}';
pub const PS: char = '\u{2029}';
pub fn is_regular_line_terminator(c: char) -> bool {
matches!(c, LF | CR)
}
pub fn is_irregular_line_terminator(c: char) -> bool {
matches!(c, LS | PS)
}
pub fn is_line_terminator(c: char) -> bool {
is_regular_line_terminator(c) || is_irregular_line_terminator(c)
}
const XX: bool = true;
const __: bool = false;
#[repr(C, align(64))]
pub struct Align64<T>(pub(crate) T);
#[rustfmt::skip]
pub static ASCII_START: Align64<[bool; 128]> = Align64([
__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, XX, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, __, __, __, __, XX, __, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, __, __, __, __, __, ]);
#[rustfmt::skip]
pub static ASCII_CONTINUE: Align64<[bool; 128]> = Align64([
__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, XX, __, __, __, __, __, __, __, __, __, __, __, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, __, __, __, __, __, __, __, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, __, __, __, __, XX, __, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, __, __, __, __, __, ]);
#[inline]
pub fn is_identifier_start(c: char) -> bool {
if c.is_ascii() {
return is_identifier_start_ascii(c);
}
is_identifier_start_unicode(c)
}
#[inline]
pub fn is_identifier_start_ascii(c: char) -> bool {
ASCII_START.0[c as usize]
}
#[inline]
pub fn is_identifier_start_unicode(c: char) -> bool {
is_id_start_unicode(c)
}
#[inline]
pub fn is_identifier_part(c: char) -> bool {
if c.is_ascii() {
return is_identifier_part_ascii(c);
}
is_identifier_part_unicode(c)
}
#[inline]
pub fn is_identifier_part_ascii(c: char) -> bool {
ASCII_CONTINUE.0[c as usize]
}
#[inline]
pub fn is_identifier_part_unicode(c: char) -> bool {
is_id_continue_unicode(c) || c == ZWNJ || c == ZWJ
}
pub fn is_identifier_name(name: &str) -> bool {
let mut chars = name.chars();
chars.next().is_some_and(is_identifier_start) && chars.all(is_identifier_part)
}