swc_ecma_lexer/
utils.rs

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            // Future reserved word
58            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            // SyntaxError in the module only, not in the strict.
82            // ```JavaScript
83            // function foo() {
84            //     "use strict";
85            //     let await = 1;
86            // }
87            // ```
88            "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            // Future reserved word
102            "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}