Skip to content

Commit

Permalink
fix(es/compat): Handle export function in reserved_word (#7251)
Browse files Browse the repository at this point in the history
  • Loading branch information
magic-akari committed Apr 12, 2023
1 parent f31f67c commit 2e947e7
Showing 1 changed file with 98 additions and 62 deletions.
160 changes: 98 additions & 62 deletions crates/swc_ecma_transforms_compat/src/es3/reserved_word.rs
@@ -1,5 +1,6 @@
use swc_common::{util::take::Take, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_visit::{noop_fold_type, Fold, FoldWith};
use swc_ecma_visit::{as_folder, noop_visit_mut_type, Fold, VisitMut, VisitMutWith};
use swc_trace_macro::swc_trace;

/// babel: `@babel/plugin-transform-reserved-words`
Expand All @@ -19,84 +20,106 @@ use swc_trace_macro::swc_trace;
/// var _abstract = 1;
/// var x = _abstract + 1;
/// ```
pub fn reserved_words(preserve_import: bool) -> impl Fold {
ReservedWord { preserve_import }
pub fn reserved_words(preserve_import: bool) -> impl VisitMut + Fold {
as_folder(ReservedWord { preserve_import })
}
struct ReservedWord {
pub preserve_import: bool,
}

#[swc_trace]
impl Fold for ReservedWord {
noop_fold_type!();
impl VisitMut for ReservedWord {
noop_visit_mut_type!();

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

n.iter_mut().for_each(|module_item| {
if let Some((ident, decl)) = match module_item {
ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { decl, .. })) => {
let ident = decl
.as_fn_decl()
.filter(|fn_decl| fn_decl.ident.is_reserved_in_es3())
.map(|fn_decl| fn_decl.ident.clone());

ident.map(|ident| (ident, decl.take()))
}
_ => None,
} {
*module_item = ModuleItem::Stmt(decl.into());

let mut orig = ident.clone();
orig.visit_mut_with(self);

extra_exports.push(
ExportNamedSpecifier {
span: DUMMY_SP,
orig: orig.into(),
exported: Some(ident.into()),
is_type_only: false,
}
.into(),
);
}

fn fold_export_named_specifier(&mut self, n: ExportNamedSpecifier) -> ExportNamedSpecifier {
let ident = match n.orig {
ModuleExportName::Ident(ident) if ident.is_reserved_in_es3() => ident,
_ => return n,
};
module_item.visit_mut_with(self);
});

if !extra_exports.is_empty() {
let module_item = ModuleItem::ModuleDecl(
NamedExport {
span: DUMMY_SP,
specifiers: extra_exports,
src: None,
type_only: false,
asserts: None,
}
.into(),
);

ExportNamedSpecifier {
orig: ident.clone().fold_with(self).into(),
exported: n.exported.or_else(|| Some(ident.into())),
..n
n.push(module_item);
}
}

fn fold_named_export(&mut self, n: NamedExport) -> NamedExport {
if n.src.is_none() {
return n.fold_children_with(self);
fn visit_mut_export_named_specifier(&mut self, n: &mut ExportNamedSpecifier) {
if matches!(&n.orig, ModuleExportName::Ident(ident) if ident.is_reserved_in_es3()) {
n.exported.get_or_insert_with(|| n.orig.clone());
n.orig.visit_mut_with(self);
}

n
}

fn fold_ident(&mut self, i: Ident) -> Ident {
fold_ident(self.preserve_import, i)
fn visit_mut_named_export(&mut self, n: &mut NamedExport) {
if n.src.is_none() {
n.visit_mut_children_with(self);
}
}

fn fold_import_named_specifier(&mut self, s: ImportNamedSpecifier) -> ImportNamedSpecifier {
if s.local.is_reserved_in_es3() {
ImportNamedSpecifier {
imported: s.imported.or_else(|| Some(s.local.clone().into())),
local: s.local.fold_with(self),
..s
}
} else {
s
fn visit_mut_ident(&mut self, i: &mut Ident) {
if self.preserve_import && i.sym == *"import" {
return;
}
}

fn fold_member_expr(&mut self, e: MemberExpr) -> MemberExpr {
MemberExpr {
obj: e.obj.fold_with(self),
prop: if let MemberProp::Computed(c) = e.prop {
MemberProp::Computed(c.fold_with(self))
} else {
e.prop
},
..e
if i.is_reserved_in_es3() {
i.sym = format!("_{}", i.sym).into()
}
}

fn fold_prop_name(&mut self, n: PropName) -> PropName {
n
fn visit_mut_import_named_specifier(&mut self, s: &mut ImportNamedSpecifier) {
if s.local.is_reserved_in_es3() {
s.imported.get_or_insert_with(|| s.local.clone().into());
s.local.visit_mut_with(self);
}
}
}

fn fold_ident(preserve_import: bool, i: Ident) -> Ident {
if preserve_import && i.sym == *"import" {
return i;
}
fn visit_mut_member_expr(&mut self, e: &mut MemberExpr) {
e.obj.visit_mut_with(self);

if i.is_reserved_in_es3() {
return Ident {
sym: format!("_{}", i.sym).into(),
..i
};
if let MemberProp::Computed(c) = &mut e.prop {
c.visit_mut_with(self);
}
}

i
fn visit_mut_prop_name(&mut self, _: &mut PropName) {}
}

#[cfg(test)]
Expand All @@ -109,9 +132,7 @@ mod tests {
($name:ident, $src:literal) => {
test!(
::swc_ecma_parser::Syntax::default(),
|_| ReservedWord {
preserve_import: false
},
|_| reserved_words(false),
$name,
$src,
$src
Expand All @@ -121,9 +142,7 @@ mod tests {

test!(
::swc_ecma_parser::Syntax::default(),
|_| ReservedWord {
preserve_import: false
},
|_| reserved_words(false),
babel_issue_6477,
r#"
function utf8CheckByte(byte) {
Expand All @@ -149,9 +168,7 @@ function utf8CheckByte(_byte) {

test!(
::swc_ecma_parser::Syntax::default(),
|_| ReservedWord {
preserve_import: false
},
|_| reserved_words(false),
issue_7164,
r#"
import { int } from './a.js'
Expand All @@ -164,4 +181,23 @@ function utf8CheckByte(_byte) {
export { _int as int };
"#
);

test!(
Default::default(),
|_| reserved_words(false),
issue_7237,
r#"
export function char() {
console.log("char====char");
return "";
}
"#,
r#"
function _char() {
console.log("char====char");
return "";
}
export { _char as char };
"#
);
}

1 comment on commit 2e947e7

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 2e947e7 Previous: e35097f Ratio
es/full/bugs-1 319841 ns/iter (± 11750) 315765 ns/iter (± 16102) 1.01
es/full/minify/libraries/antd 1598574737 ns/iter (± 17935378) 1587314589 ns/iter (± 19895504) 1.01
es/full/minify/libraries/d3 299333735 ns/iter (± 9891090) 298140636 ns/iter (± 10277053) 1.00
es/full/minify/libraries/echarts 1229622569 ns/iter (± 11519514) 1213888651 ns/iter (± 16868572) 1.01
es/full/minify/libraries/jquery 90837007 ns/iter (± 854164) 90506682 ns/iter (± 1547090) 1.00
es/full/minify/libraries/lodash 107023415 ns/iter (± 1199954) 106162635 ns/iter (± 1649507) 1.01
es/full/minify/libraries/moment 52444737 ns/iter (± 755033) 52864156 ns/iter (± 314137) 0.99
es/full/minify/libraries/react 19120961 ns/iter (± 274679) 19436642 ns/iter (± 327834) 0.98
es/full/minify/libraries/terser 246653632 ns/iter (± 8169385) 247667293 ns/iter (± 1780584) 1.00
es/full/minify/libraries/three 447032834 ns/iter (± 8336998) 444968535 ns/iter (± 6147193) 1.00
es/full/minify/libraries/typescript 2980949680 ns/iter (± 14891421) 2938249500 ns/iter (± 20180615) 1.01
es/full/minify/libraries/victory 686469403 ns/iter (± 12218935) 675348497 ns/iter (± 8650905) 1.02
es/full/minify/libraries/vue 132518779 ns/iter (± 3198801) 133376074 ns/iter (± 3929929) 0.99
es/full/codegen/es3 28588 ns/iter (± 117) 28949 ns/iter (± 56) 0.99
es/full/codegen/es5 28633 ns/iter (± 68) 29086 ns/iter (± 62) 0.98
es/full/codegen/es2015 28662 ns/iter (± 59) 29080 ns/iter (± 57) 0.99
es/full/codegen/es2016 28653 ns/iter (± 50) 29051 ns/iter (± 48) 0.99
es/full/codegen/es2017 28662 ns/iter (± 57) 29105 ns/iter (± 60) 0.98
es/full/codegen/es2018 28673 ns/iter (± 67) 29111 ns/iter (± 75) 0.98
es/full/codegen/es2019 28619 ns/iter (± 33) 29152 ns/iter (± 62) 0.98
es/full/codegen/es2020 28642 ns/iter (± 59) 29129 ns/iter (± 83) 0.98
es/full/all/es3 181465576 ns/iter (± 3503722) 185362398 ns/iter (± 2452259) 0.98
es/full/all/es5 175541080 ns/iter (± 2348694) 176126921 ns/iter (± 1900434) 1.00
es/full/all/es2015 134701490 ns/iter (± 3126389) 138050433 ns/iter (± 2557908) 0.98
es/full/all/es2016 133287230 ns/iter (± 1351787) 133995062 ns/iter (± 2435533) 0.99
es/full/all/es2017 132806810 ns/iter (± 2384609) 130843956 ns/iter (± 2904641) 1.02
es/full/all/es2018 127118127 ns/iter (± 2110436) 127578322 ns/iter (± 5242779) 1.00
es/full/all/es2019 127084738 ns/iter (± 1823082) 126857185 ns/iter (± 1868445) 1.00
es/full/all/es2020 118715970 ns/iter (± 1367735) 119153484 ns/iter (± 1529293) 1.00
es/full/parser 507971 ns/iter (± 8354) 514532 ns/iter (± 8043) 0.99
es/full/base/fixer 23215 ns/iter (± 50) 22959 ns/iter (± 35) 1.01
es/full/base/resolver_and_hygiene 84303 ns/iter (± 1426) 86955 ns/iter (± 137) 0.97
serialization of serde 120 ns/iter (± 0) 121 ns/iter (± 0) 0.99
css/minify/libraries/bootstrap 27694096 ns/iter (± 174392) 27315175 ns/iter (± 77955) 1.01
css/visitor/compare/clone 2138700 ns/iter (± 13022) 2128723 ns/iter (± 10897) 1.00
css/visitor/compare/visit_mut_span 2327704 ns/iter (± 5947) 2342959 ns/iter (± 3555) 0.99
css/visitor/compare/visit_mut_span_panic 2374429 ns/iter (± 12612) 2383127 ns/iter (± 3439) 1.00
css/visitor/compare/fold_span 3117002 ns/iter (± 13920) 3095908 ns/iter (± 12829) 1.01
css/visitor/compare/fold_span_panic 3269839 ns/iter (± 11692) 3233969 ns/iter (± 16785) 1.01
css/lexer/bootstrap_5_1_3 5126547 ns/iter (± 4996) 5106207 ns/iter (± 20864) 1.00
css/lexer/foundation_6_7_4 4319596 ns/iter (± 3383) 4341285 ns/iter (± 2778) 1.00
css/lexer/tailwind_3_1_1 820941 ns/iter (± 571) 823718 ns/iter (± 305) 1.00
css/parser/bootstrap_5_1_3 21331778 ns/iter (± 156274) 21199935 ns/iter (± 180394) 1.01
css/parser/foundation_6_7_4 16854889 ns/iter (± 57380) 16879038 ns/iter (± 102723) 1.00
css/parser/tailwind_3_1_1 3260791 ns/iter (± 4511) 3246933 ns/iter (± 8807) 1.00
es/codegen/colors 317318 ns/iter (± 180354) 326502 ns/iter (± 185653) 0.97
es/codegen/large 1330943 ns/iter (± 638891) 1254649 ns/iter (± 659051) 1.06
es/codegen/with-parser/colors 47122 ns/iter (± 255) 47538 ns/iter (± 379) 0.99
es/codegen/with-parser/large 507945 ns/iter (± 1086) 509736 ns/iter (± 1045) 1.00
es/minify/libraries/antd 1382987100 ns/iter (± 12607535) 1341652799 ns/iter (± 11979495) 1.03
es/minify/libraries/d3 258570553 ns/iter (± 4743149) 254833439 ns/iter (± 5060070) 1.01
es/minify/libraries/echarts 1061884887 ns/iter (± 6311290) 1035409227 ns/iter (± 16025202) 1.03
es/minify/libraries/jquery 79756150 ns/iter (± 1657326) 79403099 ns/iter (± 502181) 1.00
es/minify/libraries/lodash 94809999 ns/iter (± 1909168) 95793180 ns/iter (± 1780742) 0.99
es/minify/libraries/moment 45738653 ns/iter (± 402384) 46085189 ns/iter (± 391089) 0.99
es/minify/libraries/react 17174691 ns/iter (± 222895) 17305582 ns/iter (± 483210) 0.99
es/minify/libraries/terser 210716749 ns/iter (± 4135258) 207192230 ns/iter (± 4322670) 1.02
es/minify/libraries/three 363620588 ns/iter (± 8487442) 356461583 ns/iter (± 8604742) 1.02
es/minify/libraries/typescript 2509355106 ns/iter (± 18701281) 2495097778 ns/iter (± 17433550) 1.01
es/minify/libraries/victory 574382339 ns/iter (± 11579920) 543344743 ns/iter (± 11798925) 1.06
es/minify/libraries/vue 116745440 ns/iter (± 1347402) 114630589 ns/iter (± 1046688) 1.02
es/visitor/compare/clone 2339340 ns/iter (± 7312) 2300601 ns/iter (± 15291) 1.02
es/visitor/compare/visit_mut_span 2695320 ns/iter (± 3628) 2669819 ns/iter (± 4551) 1.01
es/visitor/compare/visit_mut_span_panic 2723896 ns/iter (± 3831) 2736173 ns/iter (± 3926) 1.00
es/visitor/compare/fold_span 3799684 ns/iter (± 11297) 3788995 ns/iter (± 8268) 1.00
es/visitor/compare/fold_span_panic 3936049 ns/iter (± 10469) 3936930 ns/iter (± 4055) 1.00
es/lexer/colors 13091 ns/iter (± 85) 13119 ns/iter (± 8) 1.00
es/lexer/angular 6344562 ns/iter (± 2097) 6347651 ns/iter (± 4325) 1.00
es/lexer/backbone 781528 ns/iter (± 553) 784698 ns/iter (± 599) 1.00
es/lexer/jquery 4385692 ns/iter (± 3343) 4390041 ns/iter (± 3049) 1.00
es/lexer/jquery mobile 6857084 ns/iter (± 9672) 6861509 ns/iter (± 3825) 1.00
es/lexer/mootools 3432173 ns/iter (± 7321) 3444117 ns/iter (± 7475) 1.00
es/lexer/underscore 647079 ns/iter (± 702) 647442 ns/iter (± 349) 1.00
es/lexer/three 20890170 ns/iter (± 32001) 20869670 ns/iter (± 15039) 1.00
es/lexer/yui 3870943 ns/iter (± 4941) 3855536 ns/iter (± 1848) 1.00
es/parser/colors 29040 ns/iter (± 84) 29031 ns/iter (± 62) 1.00
es/parser/angular 15339952 ns/iter (± 307470) 15055752 ns/iter (± 256691) 1.02
es/parser/backbone 2186741 ns/iter (± 14612) 2164260 ns/iter (± 11209) 1.01
es/parser/jquery 11887295 ns/iter (± 91286) 11876406 ns/iter (± 114220) 1.00
es/parser/jquery mobile 18765530 ns/iter (± 282258) 18449123 ns/iter (± 395140) 1.02
es/parser/mootools 9029073 ns/iter (± 32294) 8979694 ns/iter (± 21625) 1.01
es/parser/underscore 1839203 ns/iter (± 9342) 1824504 ns/iter (± 9665) 1.01
es/parser/three 54852324 ns/iter (± 477248) 54310520 ns/iter (± 449054) 1.01
es/parser/yui 9188641 ns/iter (± 115998) 9111370 ns/iter (± 28895) 1.01
es/preset-env/usage/builtin_type 142176 ns/iter (± 35399) 143892 ns/iter (± 33607) 0.99
es/preset-env/usage/property 20392 ns/iter (± 139) 21278 ns/iter (± 61) 0.96
es/resolver/typescript 111173243 ns/iter (± 1765413) 110315223 ns/iter (± 2852671) 1.01
es/fixer/typescript 78846285 ns/iter (± 354346) 79881524 ns/iter (± 1958158) 0.99
es/hygiene/typescript 165564028 ns/iter (± 1936376) 167594849 ns/iter (± 1225488) 0.99
es/resolver_with_hygiene/typescript 311681223 ns/iter (± 2360477) 301102017 ns/iter (± 2901350) 1.04
es/visitor/base-perf/module_clone 80418 ns/iter (± 413) 81252 ns/iter (± 584) 0.99
es/visitor/base-perf/fold_empty 90471 ns/iter (± 290) 90782 ns/iter (± 734) 1.00
es/visitor/base-perf/fold_noop_impl_all 90819 ns/iter (± 406) 90804 ns/iter (± 345) 1.00
es/visitor/base-perf/fold_noop_impl_vec 91049 ns/iter (± 413) 90754 ns/iter (± 320) 1.00
es/visitor/base-perf/boxing_boxed_clone 57 ns/iter (± 0) 58 ns/iter (± 0) 0.98
es/visitor/base-perf/boxing_unboxed_clone 41 ns/iter (± 0) 41 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 103 ns/iter (± 0) 102 ns/iter (± 0) 1.01
es/visitor/base-perf/boxing_unboxed 78 ns/iter (± 0) 78 ns/iter (± 0) 1
es/visitor/base-perf/visit_contains_this 3467 ns/iter (± 56) 3504 ns/iter (± 75) 0.99
es/base/parallel/resolver/typescript 6087025568 ns/iter (± 327771265) 6252530668 ns/iter (± 446322032) 0.97
es/base/parallel/hygiene/typescript 2013673655 ns/iter (± 30656083) 2008230070 ns/iter (± 26527131) 1.00
misc/visitors/time-complexity/time 5 103 ns/iter (± 0) 99 ns/iter (± 0) 1.04
misc/visitors/time-complexity/time 10 338 ns/iter (± 3) 331 ns/iter (± 0) 1.02
misc/visitors/time-complexity/time 15 657 ns/iter (± 4) 649 ns/iter (± 10) 1.01
misc/visitors/time-complexity/time 20 1250 ns/iter (± 2) 1197 ns/iter (± 1) 1.04
misc/visitors/time-complexity/time 40 6210 ns/iter (± 4) 6521 ns/iter (± 41) 0.95
misc/visitors/time-complexity/time 60 15598 ns/iter (± 37) 17054 ns/iter (± 43) 0.91
es/full-target/es2016 254285 ns/iter (± 396) 252839 ns/iter (± 659) 1.01
es/full-target/es2017 247509 ns/iter (± 455) 246169 ns/iter (± 511) 1.01
es/full-target/es2018 236931 ns/iter (± 1562) 235305 ns/iter (± 301) 1.01
es2020_nullish_coalescing 93327 ns/iter (± 411) 92660 ns/iter (± 438) 1.01
es2020_optional_chaining 123953 ns/iter (± 164) 125484 ns/iter (± 242) 0.99
es2022_class_properties 149176 ns/iter (± 269) 148987 ns/iter (± 379) 1.00
es2018_object_rest_spread 96831 ns/iter (± 200) 95929 ns/iter (± 238) 1.01
es2019_optional_catch_binding 85379 ns/iter (± 193) 85547 ns/iter (± 162) 1.00
es2017_async_to_generator 86102 ns/iter (± 306) 86072 ns/iter (± 176) 1.00
es2016_exponentiation 90219 ns/iter (± 309) 90480 ns/iter (± 249) 1.00
es2015_arrow 94127 ns/iter (± 304) 94225 ns/iter (± 185) 1.00
es2015_block_scoped_fn 92105 ns/iter (± 245) 92323 ns/iter (± 143) 1.00
es2015_block_scoping 169942 ns/iter (± 279) 169692 ns/iter (± 300) 1.00

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.