Skip to content

Commit fc929e9

Browse files
authoredJan 23, 2024
fix(es/compat): Support vars from reserved_word pass (#8543)
**Related issue:** - Closes #8539
1 parent ecd9403 commit fc929e9

File tree

7 files changed

+98
-25
lines changed

7 files changed

+98
-25
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"jsc": {
3+
"parser": {
4+
"syntax": "ecmascript",
5+
"jsx": false
6+
},
7+
"loose": false,
8+
"minify": {
9+
"compress": false,
10+
"mangle": false
11+
}
12+
},
13+
"module": {
14+
"type": "es6"
15+
},
16+
"minify": false,
17+
"isModule": true,
18+
"env": {
19+
"targets": "chrome >= 12"
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export const goto = () => {
2+
return null
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
var _goto = function() {
2+
return null;
3+
};
4+
export { _goto as goto };

‎crates/swc_ecma_compat_es3/src/reserved_word.rs

+70-25
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use swc_common::{util::take::Take, DUMMY_SP};
22
use swc_ecma_ast::*;
33
use swc_ecma_visit::{as_folder, noop_visit_mut_type, Fold, VisitMut, VisitMutWith};
4-
use swc_trace_macro::swc_trace;
54

65
/// babel: `@babel/plugin-transform-reserved-words`
76
///
@@ -27,39 +26,85 @@ struct ReservedWord {
2726
pub preserve_import: bool,
2827
}
2928

30-
#[swc_trace]
3129
impl VisitMut for ReservedWord {
3230
noop_visit_mut_type!();
3331

3432
fn visit_mut_module_items(&mut self, n: &mut Vec<ModuleItem>) {
3533
let mut extra_exports = vec![];
3634

3735
n.iter_mut().for_each(|module_item| {
38-
if let Some((ident, decl)) = match module_item {
39-
ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { decl, .. })) => {
40-
let ident = decl
41-
.as_fn_decl()
42-
.filter(|fn_decl| fn_decl.ident.is_reserved_in_es3())
43-
.map(|fn_decl| fn_decl.ident.clone());
44-
45-
ident.map(|ident| (ident, decl.take()))
36+
match module_item {
37+
ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl {
38+
decl: decl @ Decl::Fn(..) | decl @ Decl::Class(..),
39+
..
40+
})) => {
41+
let ident = match decl {
42+
Decl::Class(d) => d.ident.clone(),
43+
Decl::Fn(d) => d.ident.clone(),
44+
_ => {
45+
unreachable!()
46+
}
47+
};
48+
49+
if !ident.is_reserved_in_es3() {
50+
return;
51+
}
52+
53+
*module_item = ModuleItem::Stmt(decl.take().into());
54+
55+
let mut orig = ident.clone();
56+
orig.visit_mut_with(self);
57+
58+
extra_exports.push(
59+
ExportNamedSpecifier {
60+
span: DUMMY_SP,
61+
orig: orig.into(),
62+
exported: Some(ident.into()),
63+
is_type_only: false,
64+
}
65+
.into(),
66+
);
4667
}
47-
_ => None,
48-
} {
49-
*module_item = ModuleItem::Stmt(decl.into());
50-
51-
let mut orig = ident.clone();
52-
orig.visit_mut_with(self);
53-
54-
extra_exports.push(
55-
ExportNamedSpecifier {
56-
span: DUMMY_SP,
57-
orig: orig.into(),
58-
exported: Some(ident.into()),
59-
is_type_only: false,
68+
69+
ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl {
70+
decl: Decl::Var(var),
71+
..
72+
})) => {
73+
if var.decls.iter().all(|var| {
74+
if let Pat::Ident(i) = &var.name {
75+
!i.id.sym.is_reserved_in_es3()
76+
} else {
77+
true
78+
}
79+
}) {
80+
return;
6081
}
61-
.into(),
62-
);
82+
83+
for var in &var.decls {
84+
let ident = var.name.clone().expect_ident().id;
85+
86+
if !ident.is_reserved_in_es3() {
87+
return;
88+
}
89+
90+
let mut orig = ident.clone();
91+
orig.visit_mut_with(self);
92+
93+
extra_exports.push(
94+
ExportNamedSpecifier {
95+
span: DUMMY_SP,
96+
orig: orig.into(),
97+
exported: Some(ident.into()),
98+
is_type_only: false,
99+
}
100+
.into(),
101+
);
102+
}
103+
104+
*module_item = ModuleItem::Stmt(Decl::Var(var.take()).into());
105+
}
106+
107+
_ => {}
63108
}
64109

65110
module_item.visit_mut_with(self);

0 commit comments

Comments
 (0)
Please sign in to comment.