34 lines
877 B
Rust
34 lines
877 B
Rust
use super::{is_name, is_name_start};
|
|
|
|
pub(crate) fn is_ident(s: &str) -> bool {
|
|
let mut chars = s.chars().peekable();
|
|
match chars.next() {
|
|
Some(c) if is_name_start(c) && !c.is_numeric() => {}
|
|
Some(..) | None => return false,
|
|
}
|
|
while let Some(c) = chars.next() {
|
|
if c == '\\' {
|
|
for _ in 0..6 {
|
|
let next = match chars.next() {
|
|
Some(t) => t,
|
|
None => return true,
|
|
};
|
|
if !next.is_ascii_hexdigit() {
|
|
break;
|
|
}
|
|
}
|
|
match chars.peek() {
|
|
Some(c) if c.is_whitespace() => {
|
|
chars.next();
|
|
}
|
|
_ => {}
|
|
};
|
|
continue;
|
|
}
|
|
if !is_name(c) {
|
|
return false;
|
|
}
|
|
}
|
|
true
|
|
}
|