1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
use ast::*;
use swc_common::{Fold, FoldWith};
#[derive(Default, Clone, Copy)]
pub struct ReservedWord;
impl Fold<Ident> for ReservedWord {
fn fold(&mut self, i: Ident) -> Ident {
fold_ident(i)
}
}
macro_rules! noop {
($T:tt) => {
impl Fold<$T> for ReservedWord {
fn fold(&mut self, node: $T) -> $T {
node
}
}
};
}
noop!(PropName);
noop!(ExportSpecifier);
impl Fold<ImportSpecific> for ReservedWord {
fn fold(&mut self, s: ImportSpecific) -> ImportSpecific {
if s.imported.is_some() {
ImportSpecific {
local: s.local.fold_with(self),
..s
}
} else {
ImportSpecific {
imported: s.imported.fold_with(self),
..s
}
}
}
}
impl Fold<MemberExpr> for ReservedWord {
fn fold(&mut self, e: MemberExpr) -> MemberExpr {
if e.computed {
MemberExpr {
obj: e.obj.fold_with(self),
prop: e.prop.fold_with(self),
..e
}
} else {
MemberExpr {
obj: e.obj.fold_with(self),
..e
}
}
}
}
fn fold_ident(i: Ident) -> Ident {
if i.is_reserved_for_es3() {
return Ident {
sym: format!("_{}", i.sym).into(),
..i
};
}
i
}
#[cfg(test)]
mod tests {
use super::*;
macro_rules! identical {
($name:ident, $src:literal) => {
test!(
::swc_ecma_parser::Syntax::default(),
|_| ReservedWord,
$name,
$src,
$src
);
};
}
test!(
::swc_ecma_parser::Syntax::default(),
|_| ReservedWord,
babel_issue_6477,
r#"
function utf8CheckByte(byte) {
if (byte <= 0x7F) return 0;
else if (byte >> 5 === 0x06) return 2;
else if (byte >> 4 === 0x0E) return 3;
else if (byte >> 3 === 0x1E) return 4;
return -1;
}
"#,
r#"
function utf8CheckByte(_byte) {
if (_byte <= 0x7F) return 0;
else if (_byte >> 5 === 0x06) return 2;
else if (_byte >> 4 === 0x0E) return 3;
else if (_byte >> 3 === 0x1E) return 4;
return -1;
}
"#
);
identical!(export_as_default, "export { Foo as default }");
}