1use swc_atoms::Atom;
2
3use super::Context;
4use crate::token::*;
5
6impl Context {
7 pub fn is_reserved(self, word: &Word) -> bool {
8 match *word {
9 Word::Keyword(Keyword::Let) | Word::Ident(IdentLike::Known(known_ident!("static"))) => {
10 self.contains(Context::Strict)
11 }
12 Word::Keyword(Keyword::Await) => {
13 self.contains(Context::InAsync)
14 || self.contains(Context::InStaticBlock)
15 || self.contains(Context::Strict)
16 }
17 Word::Keyword(Keyword::Yield) => {
18 self.contains(Context::InGenerator) || self.contains(Context::Strict)
19 }
20
21 Word::Null
22 | Word::True
23 | Word::False
24 | Word::Keyword(Keyword::Break)
25 | Word::Keyword(Keyword::Case)
26 | Word::Keyword(Keyword::Catch)
27 | Word::Keyword(Keyword::Continue)
28 | Word::Keyword(Keyword::Debugger)
29 | Word::Keyword(Keyword::Default_)
30 | Word::Keyword(Keyword::Do)
31 | Word::Keyword(Keyword::Export)
32 | Word::Keyword(Keyword::Else)
33 | Word::Keyword(Keyword::Finally)
34 | Word::Keyword(Keyword::For)
35 | Word::Keyword(Keyword::Function)
36 | Word::Keyword(Keyword::If)
37 | Word::Keyword(Keyword::Return)
38 | Word::Keyword(Keyword::Switch)
39 | Word::Keyword(Keyword::Throw)
40 | Word::Keyword(Keyword::Try)
41 | Word::Keyword(Keyword::Var)
42 | Word::Keyword(Keyword::Const)
43 | Word::Keyword(Keyword::While)
44 | Word::Keyword(Keyword::With)
45 | Word::Keyword(Keyword::New)
46 | Word::Keyword(Keyword::This)
47 | Word::Keyword(Keyword::Super)
48 | Word::Keyword(Keyword::Class)
49 | Word::Keyword(Keyword::Extends)
50 | Word::Keyword(Keyword::Import)
51 | Word::Keyword(Keyword::In)
52 | Word::Keyword(Keyword::InstanceOf)
53 | Word::Keyword(Keyword::TypeOf)
54 | Word::Keyword(Keyword::Void)
55 | Word::Keyword(Keyword::Delete) => true,
56
57 Word::Ident(IdentLike::Known(known_ident!("enum"))) => true,
59
60 Word::Ident(IdentLike::Known(
61 known_ident!("implements")
62 | known_ident!("package")
63 | known_ident!("protected")
64 | known_ident!("interface")
65 | known_ident!("private")
66 | known_ident!("public"),
67 )) if self.contains(Context::Strict) => true,
68
69 _ => false,
70 }
71 }
72
73 #[cfg_attr(not(feature = "verify"), inline(always))]
74 pub fn is_reserved_word(self, word: &Atom) -> bool {
75 if !cfg!(feature = "verify") {
76 return false;
77 }
78
79 match &**word {
80 "let" => self.contains(Context::Strict),
81 "await" => {
89 self.contains(Context::InAsync)
90 || self.contains(Context::InStaticBlock)
91 || self.contains(Context::Module)
92 }
93 "yield" => self.contains(Context::InGenerator) || self.contains(Context::Strict),
94
95 "null" | "true" | "false" | "break" | "case" | "catch" | "continue" | "debugger"
96 | "default" | "do" | "export" | "else" | "finally" | "for" | "function" | "if"
97 | "return" | "switch" | "throw" | "try" | "var" | "const" | "while" | "with"
98 | "new" | "this" | "super" | "class" | "extends" | "import" | "in" | "instanceof"
99 | "typeof" | "void" | "delete" => true,
100
101 "enum" => true,
103
104 "implements" | "package" | "protected" | "interface" | "private" | "public"
105 if self.contains(Context::Strict) =>
106 {
107 true
108 }
109
110 _ => false,
111 }
112 }
113}