swc_ecma_transforms_compat/
reserved_words.rs1use 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 if is_reserved(&*sym) {
92 let s = format!("_{sym}").into();
93 *sym = s;
94 }
95}