Skip to content

Commit

Permalink
feat(es/minifier): Support PURE comment of seq exprs (#7245)
Browse files Browse the repository at this point in the history
**Related issue:**

 - Closes #7241.
  • Loading branch information
kdy1 committed Apr 11, 2023
1 parent a0e193d commit 559d120
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 11 deletions.
18 changes: 18 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7241/input/.swcrc
@@ -0,0 +1,18 @@
{
"jsc": {
"parser": {
"syntax": "ecmascript",
"jsx": false
},
"target": "es2022",
"loose": false,
"minify": {
"compress": true,
"mangle": true
}
},
"module": {
"type": "es6"
},
"isModule": true
}
18 changes: 18 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7241/input/index.js
@@ -0,0 +1,18 @@
(function () {
function forwardRef() {
return something();
}

function Test() {
return 'Test';
}
const _Test = /*#__PURE__*/ (0, forwardRef)(Test);
function Other() {
return 'Other';
}
const _Other = /*#__PURE__*/ (0, forwardRef)(Other);


console.log((0, _Test));

})();
4 changes: 4 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7241/output/index.js
@@ -0,0 +1,4 @@
!function() {
let o = something();
console.log(o);
}();
32 changes: 21 additions & 11 deletions crates/swc_ecma_minifier/src/metadata/mod.rs
Expand Up @@ -132,7 +132,17 @@ impl VisitMut for InfoMarker<'_> {
n.span = n.span.apply_mark(self.marks.noinline);
}

if self.has_pure(n.span) {
// We check callee in some cases because we move comments
// See https://github.com/swc-project/swc/issues/7241
if self.has_pure(n.span)
|| match &n.callee {
Callee::Expr(e) => match &**e {
Expr::Seq(callee) => self.has_pure(callee.span),
_ => false,
},
_ => false,
}
{
n.span = n.span.apply_mark(self.marks.pure);
} else if let Some(pure_fns) = &self.pure_funcs {
if let Callee::Expr(e) = &n.callee {
Expand All @@ -146,14 +156,6 @@ impl VisitMut for InfoMarker<'_> {
}
}

fn visit_mut_new_expr(&mut self, n: &mut NewExpr) {
n.visit_mut_children_with(self);

if self.has_pure(n.span) {
n.span = n.span.apply_mark(self.marks.pure);
}
}

fn visit_mut_export_default_decl(&mut self, e: &mut ExportDefaultDecl) {
self.state.is_in_export = true;
e.visit_mut_children_with(self);
Expand Down Expand Up @@ -199,7 +201,7 @@ impl VisitMut for InfoMarker<'_> {

fn visit_mut_lit(&mut self, _: &mut Lit) {}

fn visit_mut_script(&mut self, n: &mut Script) {
fn visit_mut_module(&mut self, n: &mut Module) {
n.visit_mut_children_with(self);

if self.state.is_bundle {
Expand All @@ -210,7 +212,15 @@ impl VisitMut for InfoMarker<'_> {
}
}

fn visit_mut_module(&mut self, n: &mut Module) {
fn visit_mut_new_expr(&mut self, n: &mut NewExpr) {
n.visit_mut_children_with(self);

if self.has_pure(n.span) {
n.span = n.span.apply_mark(self.marks.pure);
}
}

fn visit_mut_script(&mut self, n: &mut Script) {
n.visit_mut_children_with(self);

if self.state.is_bundle {
Expand Down
18 changes: 18 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/7241/input.js
@@ -0,0 +1,18 @@
(function () {
function forwardRef() {
return something();
}

function Test() {
return 'Test';
}
const _Test = /*#__PURE__*/ (0, forwardRef)(Test);
function Other() {
return 'Other';
}
const _Other = /*#__PURE__*/ (0, forwardRef)(Other);


console.log((0, _Test));

})();
4 changes: 4 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/7241/output.js
@@ -0,0 +1,4 @@
!function() {
const _Test = something();
console.log(_Test);
}();

1 comment on commit 559d120

@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: 559d120 Previous: 70b86db Ratio
es/full/bugs-1 303972 ns/iter (± 2787) 308127 ns/iter (± 9964) 0.99
es/full/minify/libraries/antd 1632955795 ns/iter (± 51258387) 1531947464 ns/iter (± 15098373) 1.07
es/full/minify/libraries/d3 304914250 ns/iter (± 12568438) 294276857 ns/iter (± 10037944) 1.04
es/full/minify/libraries/echarts 1231987932 ns/iter (± 47344545) 1191198445 ns/iter (± 8485209) 1.03
es/full/minify/libraries/jquery 88761084 ns/iter (± 1532737) 89727161 ns/iter (± 964097) 0.99
es/full/minify/libraries/lodash 104541419 ns/iter (± 2085302) 104884104 ns/iter (± 803683) 1.00
es/full/minify/libraries/moment 52889369 ns/iter (± 734479) 51733906 ns/iter (± 294250) 1.02
es/full/minify/libraries/react 19258895 ns/iter (± 287549) 18843747 ns/iter (± 132602) 1.02
es/full/minify/libraries/terser 244736861 ns/iter (± 5232656) 243400755 ns/iter (± 3082680) 1.01
es/full/minify/libraries/three 450722409 ns/iter (± 10455313) 426932079 ns/iter (± 6451055) 1.06
es/full/minify/libraries/typescript 3053062376 ns/iter (± 47867101) 2918643204 ns/iter (± 19927385) 1.05
es/full/minify/libraries/victory 693572441 ns/iter (± 7285310) 646452844 ns/iter (± 9007056) 1.07
es/full/minify/libraries/vue 131748134 ns/iter (± 1630164) 128879490 ns/iter (± 983811) 1.02
es/full/codegen/es3 28787 ns/iter (± 277) 28970 ns/iter (± 40) 0.99
es/full/codegen/es5 28993 ns/iter (± 126) 29027 ns/iter (± 63) 1.00
es/full/codegen/es2015 29083 ns/iter (± 459) 29022 ns/iter (± 92) 1.00
es/full/codegen/es2016 29274 ns/iter (± 34) 28955 ns/iter (± 88) 1.01
es/full/codegen/es2017 28993 ns/iter (± 271) 28955 ns/iter (± 82) 1.00
es/full/codegen/es2018 28576 ns/iter (± 433) 29025 ns/iter (± 59) 0.98
es/full/codegen/es2019 28448 ns/iter (± 120) 29009 ns/iter (± 56) 0.98
es/full/codegen/es2020 28901 ns/iter (± 123) 28971 ns/iter (± 60) 1.00
es/full/all/es3 181837823 ns/iter (± 2794068) 179608009 ns/iter (± 3595818) 1.01
es/full/all/es5 173302375 ns/iter (± 1188257) 170061636 ns/iter (± 2190598) 1.02
es/full/all/es2015 134372305 ns/iter (± 1361398) 131762487 ns/iter (± 2517929) 1.02
es/full/all/es2016 131092045 ns/iter (± 2126445) 130748155 ns/iter (± 946699) 1.00
es/full/all/es2017 128042887 ns/iter (± 2710592) 128666536 ns/iter (± 1712091) 1.00
es/full/all/es2018 124602920 ns/iter (± 1875507) 123860624 ns/iter (± 2371671) 1.01
es/full/all/es2019 124879962 ns/iter (± 1274757) 122628770 ns/iter (± 1199224) 1.02
es/full/all/es2020 118093511 ns/iter (± 1391534) 116544551 ns/iter (± 622147) 1.01
es/full/parser 509922 ns/iter (± 4215) 510805 ns/iter (± 7235) 1.00
es/full/base/fixer 24093 ns/iter (± 101) 22660 ns/iter (± 57) 1.06
es/full/base/resolver_and_hygiene 82821 ns/iter (± 698) 83867 ns/iter (± 124) 0.99
serialization of serde 121 ns/iter (± 1) 120 ns/iter (± 0) 1.01
css/minify/libraries/bootstrap 27760778 ns/iter (± 223920) 27149141 ns/iter (± 68533) 1.02
css/visitor/compare/clone 2221787 ns/iter (± 129687) 2136430 ns/iter (± 6618) 1.04
css/visitor/compare/visit_mut_span 2651781 ns/iter (± 9357) 2324215 ns/iter (± 13715) 1.14
css/visitor/compare/visit_mut_span_panic 2718716 ns/iter (± 19777) 2381531 ns/iter (± 6324) 1.14
css/visitor/compare/fold_span 3495269 ns/iter (± 27377) 3088909 ns/iter (± 20079) 1.13
css/visitor/compare/fold_span_panic 3656735 ns/iter (± 14529) 3236159 ns/iter (± 11738) 1.13
css/lexer/bootstrap_5_1_3 5031181 ns/iter (± 61702) 5103838 ns/iter (± 42508) 0.99
css/lexer/foundation_6_7_4 4201523 ns/iter (± 22171) 4289973 ns/iter (± 1848) 0.98
css/lexer/tailwind_3_1_1 815300 ns/iter (± 9040) 815355 ns/iter (± 1871) 1.00
css/parser/bootstrap_5_1_3 21237712 ns/iter (± 200511) 21276760 ns/iter (± 134956) 1.00
css/parser/foundation_6_7_4 16638610 ns/iter (± 277703) 16824427 ns/iter (± 47949) 0.99
css/parser/tailwind_3_1_1 3246653 ns/iter (± 26017) 3243932 ns/iter (± 4228) 1.00
es/codegen/colors 327901 ns/iter (± 188401) 327323 ns/iter (± 185011) 1.00
es/codegen/large 1294096 ns/iter (± 665545) 1245461 ns/iter (± 641034) 1.04
es/codegen/with-parser/colors 47178 ns/iter (± 623) 47565 ns/iter (± 310) 0.99
es/codegen/with-parser/large 501090 ns/iter (± 6495) 510561 ns/iter (± 1223) 0.98
es/minify/libraries/antd 1352989374 ns/iter (± 78541943) 1339372663 ns/iter (± 14752601) 1.01
es/minify/libraries/d3 249245662 ns/iter (± 11021965) 247756344 ns/iter (± 2494576) 1.01
es/minify/libraries/echarts 1094717066 ns/iter (± 28291970) 1022489514 ns/iter (± 12309191) 1.07
es/minify/libraries/jquery 79181930 ns/iter (± 1411704) 78004666 ns/iter (± 540933) 1.02
es/minify/libraries/lodash 94689352 ns/iter (± 1831390) 93476994 ns/iter (± 684887) 1.01
es/minify/libraries/moment 45167341 ns/iter (± 700419) 45147206 ns/iter (± 451130) 1.00
es/minify/libraries/react 17059033 ns/iter (± 131940) 16851257 ns/iter (± 126913) 1.01
es/minify/libraries/terser 206097902 ns/iter (± 3977396) 206141487 ns/iter (± 2879894) 1.00
es/minify/libraries/three 376714766 ns/iter (± 10334038) 347422648 ns/iter (± 3845231) 1.08
es/minify/libraries/typescript 2663000614 ns/iter (± 67752570) 2484216438 ns/iter (± 19109960) 1.07
es/minify/libraries/victory 592189789 ns/iter (± 14598142) 551901927 ns/iter (± 30010586) 1.07
es/minify/libraries/vue 117599643 ns/iter (± 2225245) 114418740 ns/iter (± 999883) 1.03
es/visitor/compare/clone 2553019 ns/iter (± 72849) 2317316 ns/iter (± 13891) 1.10
es/visitor/compare/visit_mut_span 2972212 ns/iter (± 6922) 2689065 ns/iter (± 36701) 1.11
es/visitor/compare/visit_mut_span_panic 2979890 ns/iter (± 29837) 2738542 ns/iter (± 2952) 1.09
es/visitor/compare/fold_span 4099984 ns/iter (± 39460) 3782432 ns/iter (± 5945) 1.08
es/visitor/compare/fold_span_panic 4249287 ns/iter (± 27679) 3907029 ns/iter (± 9343) 1.09
es/lexer/colors 12857 ns/iter (± 138) 13008 ns/iter (± 6) 0.99
es/lexer/angular 6285982 ns/iter (± 46784) 6344234 ns/iter (± 2760) 0.99
es/lexer/backbone 763971 ns/iter (± 8769) 786892 ns/iter (± 337) 0.97
es/lexer/jquery 4278000 ns/iter (± 53747) 4379726 ns/iter (± 4584) 0.98
es/lexer/jquery mobile 6693427 ns/iter (± 57342) 6864150 ns/iter (± 4154) 0.98
es/lexer/mootools 3369881 ns/iter (± 22492) 3442039 ns/iter (± 2306) 0.98
es/lexer/underscore 643971 ns/iter (± 1711) 646351 ns/iter (± 619) 1.00
es/lexer/three 20492090 ns/iter (± 222007) 20896183 ns/iter (± 29276) 0.98
es/lexer/yui 3836361 ns/iter (± 21555) 3861229 ns/iter (± 1406) 0.99
es/parser/colors 28989 ns/iter (± 307) 29441 ns/iter (± 56) 0.98
es/parser/angular 14922404 ns/iter (± 240595) 15035068 ns/iter (± 105921) 0.99
es/parser/backbone 2139135 ns/iter (± 36651) 2188437 ns/iter (± 15310) 0.98
es/parser/jquery 11843667 ns/iter (± 107874) 11768350 ns/iter (± 96969) 1.01
es/parser/jquery mobile 17874106 ns/iter (± 283744) 18367820 ns/iter (± 146573) 0.97
es/parser/mootools 8957854 ns/iter (± 56957) 9026520 ns/iter (± 21279) 0.99
es/parser/underscore 1834347 ns/iter (± 9100) 1841338 ns/iter (± 10656) 1.00
es/parser/three 55733867 ns/iter (± 561884) 53670629 ns/iter (± 516269) 1.04
es/parser/yui 9172182 ns/iter (± 95816) 9125297 ns/iter (± 46921) 1.01
es/preset-env/usage/builtin_type 139762 ns/iter (± 30919) 144300 ns/iter (± 34355) 0.97
es/preset-env/usage/property 21108 ns/iter (± 135) 21145 ns/iter (± 187) 1.00
es/resolver/typescript 122363347 ns/iter (± 2373076) 113190316 ns/iter (± 2135327) 1.08
es/fixer/typescript 91435732 ns/iter (± 1986008) 81207899 ns/iter (± 1562549) 1.13
es/hygiene/typescript 192286710 ns/iter (± 1945461) 168378622 ns/iter (± 860052) 1.14
es/resolver_with_hygiene/typescript 321963156 ns/iter (± 3094799) 304098149 ns/iter (± 2492615) 1.06
es/visitor/base-perf/module_clone 80110 ns/iter (± 1030) 80438 ns/iter (± 520) 1.00
es/visitor/base-perf/fold_empty 87714 ns/iter (± 361) 90825 ns/iter (± 365) 0.97
es/visitor/base-perf/fold_noop_impl_all 89405 ns/iter (± 699) 90905 ns/iter (± 310) 0.98
es/visitor/base-perf/fold_noop_impl_vec 90652 ns/iter (± 831) 91040 ns/iter (± 533) 1.00
es/visitor/base-perf/boxing_boxed_clone 56 ns/iter (± 0) 56 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed_clone 41 ns/iter (± 0) 41 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 101 ns/iter (± 1) 102 ns/iter (± 0) 0.99
es/visitor/base-perf/boxing_unboxed 78 ns/iter (± 0) 78 ns/iter (± 0) 1
es/visitor/base-perf/visit_contains_this 3437 ns/iter (± 68) 3500 ns/iter (± 92) 0.98
es/base/parallel/resolver/typescript 6276850805 ns/iter (± 525929933) 6100661718 ns/iter (± 421020112) 1.03
es/base/parallel/hygiene/typescript 2219023652 ns/iter (± 12161507) 2003579054 ns/iter (± 18729547) 1.11
misc/visitors/time-complexity/time 5 96 ns/iter (± 0) 99 ns/iter (± 0) 0.97
misc/visitors/time-complexity/time 10 328 ns/iter (± 2) 334 ns/iter (± 4) 0.98
misc/visitors/time-complexity/time 15 640 ns/iter (± 11) 650 ns/iter (± 0) 0.98
misc/visitors/time-complexity/time 20 1175 ns/iter (± 12) 1250 ns/iter (± 1) 0.94
misc/visitors/time-complexity/time 40 6516 ns/iter (± 61) 6594 ns/iter (± 65) 0.99
misc/visitors/time-complexity/time 60 16688 ns/iter (± 217) 17037 ns/iter (± 166) 0.98
es/full-target/es2016 252704 ns/iter (± 1141) 253337 ns/iter (± 513) 1.00
es/full-target/es2017 239357 ns/iter (± 2563) 246397 ns/iter (± 429) 0.97
es/full-target/es2018 229942 ns/iter (± 2709) 235161 ns/iter (± 369) 0.98
es2020_nullish_coalescing 91033 ns/iter (± 1123) 93179 ns/iter (± 453) 0.98
es2020_optional_chaining 124589 ns/iter (± 207) 124828 ns/iter (± 330) 1.00
es2022_class_properties 147028 ns/iter (± 1166) 149111 ns/iter (± 327) 0.99
es2018_object_rest_spread 95131 ns/iter (± 609) 95894 ns/iter (± 181) 0.99
es2019_optional_catch_binding 84658 ns/iter (± 1065) 85280 ns/iter (± 172) 0.99
es2017_async_to_generator 85350 ns/iter (± 461) 85715 ns/iter (± 320) 1.00
es2016_exponentiation 89417 ns/iter (± 1039) 90249 ns/iter (± 307) 0.99
es2015_arrow 93687 ns/iter (± 561) 94179 ns/iter (± 320) 0.99
es2015_block_scoped_fn 91427 ns/iter (± 646) 92135 ns/iter (± 126) 0.99
es2015_block_scoping 169367 ns/iter (± 472) 170138 ns/iter (± 302) 1.00

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

Please sign in to comment.