const VALID_KEYWORD_LENS: u16 = 0b11111111100;
#[inline]
pub fn is_keyword(name: &[u8]) -> bool {
let len = name.len();
if len > 15 || (VALID_KEYWORD_LENS >> len) & 1 == 0 {
return false;
}
let first = name[0];
match len {
2 => match first {
b'd' => name == b"do",
b'i' => name == b"if" || name == b"in",
_ => false,
},
3 => match first {
b'f' => name == b"for",
b'l' => name == b"let",
b'n' => name == b"new",
b't' => name == b"try",
b'v' => name == b"var",
_ => false,
},
4 => match first {
b'c' => name == b"case",
b'e' => name == b"else" || name == b"enum",
b'n' => name == b"null",
b't' => name == b"true" || name == b"this",
b'v' => name == b"void",
b'w' => name == b"with",
_ => false,
},
5 => match first {
b'a' => name == b"await",
b'b' => name == b"break",
b'c' => name == b"catch" || name == b"class" || name == b"const",
b'f' => name == b"false",
b's' => name == b"super",
b't' => name == b"throw",
b'w' => name == b"while",
b'y' => name == b"yield",
_ => false,
},
6 => match first {
b'd' => name == b"delete",
b'e' => name == b"export",
b'i' => name == b"import",
b'r' => name == b"return",
b's' => name == b"static" || name == b"switch",
b't' => name == b"typeof",
_ => false,
},
7 => match first {
b'd' => name == b"default",
b'e' => name == b"extends",
b'f' => name == b"finally",
_ => false,
},
8 => match first {
b'c' => name == b"continue",
b'd' => name == b"debugger",
b'f' => name == b"function",
_ => false,
},
9 => first == b'u' && name == b"undefined",
10 => first == b'i' && name == b"instanceof",
_ => false,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_keywords_by_length() {
assert!(is_keyword(b"do"));
assert!(is_keyword(b"if"));
assert!(is_keyword(b"in"));
assert!(is_keyword(b"for"));
assert!(is_keyword(b"let"));
assert!(is_keyword(b"new"));
assert!(is_keyword(b"try"));
assert!(is_keyword(b"var"));
assert!(is_keyword(b"case"));
assert!(is_keyword(b"else"));
assert!(is_keyword(b"enum"));
assert!(is_keyword(b"null"));
assert!(is_keyword(b"true"));
assert!(is_keyword(b"this"));
assert!(is_keyword(b"void"));
assert!(is_keyword(b"with"));
assert!(is_keyword(b"await"));
assert!(is_keyword(b"break"));
assert!(is_keyword(b"catch"));
assert!(is_keyword(b"class"));
assert!(is_keyword(b"const"));
assert!(is_keyword(b"false"));
assert!(is_keyword(b"super"));
assert!(is_keyword(b"throw"));
assert!(is_keyword(b"while"));
assert!(is_keyword(b"yield"));
assert!(is_keyword(b"delete"));
assert!(is_keyword(b"export"));
assert!(is_keyword(b"import"));
assert!(is_keyword(b"return"));
assert!(is_keyword(b"static"));
assert!(is_keyword(b"switch"));
assert!(is_keyword(b"typeof"));
assert!(is_keyword(b"default"));
assert!(is_keyword(b"extends"));
assert!(is_keyword(b"finally"));
assert!(is_keyword(b"continue"));
assert!(is_keyword(b"debugger"));
assert!(is_keyword(b"function"));
assert!(is_keyword(b"undefined"));
assert!(is_keyword(b"instanceof"));
}
#[test]
fn test_non_keywords() {
assert!(!is_keyword(b"foo"));
assert!(!is_keyword(b"bar"));
assert!(!is_keyword(b"myVariable"));
assert!(!is_keyword(b"a")); assert!(!is_keyword(b"verylongidentifier")); assert!(!is_keyword(b"Class")); assert!(!is_keyword(b"TRUE")); }
#[test]
fn test_edge_cases() {
assert!(!is_keyword(b"")); assert!(!is_keyword(b"x")); assert!(!is_keyword(b"for_")); assert!(!is_keyword(b"_for")); }
}