swc_ecma_transforms_compat/
reserved_words.rs

1use swc_atoms::Atom;
2use swc_ecma_ast::*;
3use swc_ecma_transforms_base::perf::Parallel;
4use swc_ecma_visit::{
5    noop_visit_mut_type, visit_mut_obj_and_computed, visit_mut_pass, VisitMut, VisitMutWith,
6};
7
8pub fn reserved_words() -> impl 'static + Pass + VisitMut {
9    visit_mut_pass(EsReservedWord)
10}
11
12#[derive(Clone, Copy)]
13struct EsReservedWord;
14
15impl Parallel for EsReservedWord {
16    fn create(&self) -> Self {
17        *self
18    }
19
20    fn merge(&mut self, _: Self) {}
21}
22
23impl VisitMut for EsReservedWord {
24    noop_visit_mut_type!(fail);
25
26    visit_mut_obj_and_computed!();
27
28    fn visit_mut_export_specifier(&mut self, _n: &mut ExportSpecifier) {}
29
30    fn visit_mut_ident(&mut self, i: &mut Ident) {
31        rename_ident(&mut i.sym, true);
32    }
33
34    fn visit_mut_import_named_specifier(&mut self, s: &mut ImportNamedSpecifier) {
35        s.local.visit_mut_with(self);
36    }
37
38    fn visit_mut_private_name(&mut self, _: &mut PrivateName) {}
39
40    fn visit_mut_prop_name(&mut self, _n: &mut PropName) {}
41}
42
43fn is_reserved(sym: &str) -> bool {
44    matches!(
45        sym,
46        "enum"
47            | "implements"
48            | "package"
49            | "protected"
50            | "interface"
51            | "private"
52            | "public"
53            | "await"
54            | "break"
55            | "case"
56            | "catch"
57            | "class"
58            | "const"
59            | "continue"
60            | "debugger"
61            | "default"
62            | "delete"
63            | "do"
64            | "else"
65            | "export"
66            | "extends"
67            | "finally"
68            | "for"
69            | "function"
70            | "if"
71            | "in"
72            | "instanceof"
73            | "new"
74            | "return"
75            | "super"
76            | "switch"
77            | "this"
78            | "throw"
79            | "try"
80            | "typeof"
81            | "var"
82            | "void"
83            | "while"
84            | "with"
85            | "yield"
86    )
87}
88
89fn rename_ident(sym: &mut Atom, _strict: bool) {
90    // Es
91    if is_reserved(&*sym) {
92        let s = format!("_{sym}").into();
93        *sym = s;
94    }
95}