Skip to content

Commit

Permalink
fix(es/minifier): Fix handling of optional chaining when `hoist_props…
Browse files Browse the repository at this point in the history
…` is enabled (#7246)

**Related issue:**

 - Closes #7228.
  • Loading branch information
kdy1 committed Apr 13, 2023
1 parent dd56100 commit a44fea1
Show file tree
Hide file tree
Showing 7 changed files with 130 additions and 0 deletions.
64 changes: 64 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7228/input/.swcrc
@@ -0,0 +1,64 @@
{
"jsc": {
"parser": {
"syntax": "ecmascript",
"jsx": false
},
"target": "es2022",
"loose": false,
"minify": {
"compress": {
"arguments": false,
"arrows": false,
"booleans": false,
"booleans_as_integers": false,
"collapse_vars": false,
"comparisons": false,
"computed_props": false,
"conditionals": false,
"dead_code": false,
"directives": false,
"drop_console": false,
"drop_debugger": false,
"evaluate": false,
"expression": false,
"hoist_funs": false,
"hoist_props": true,
"hoist_vars": false,
"if_return": false,
"join_vars": false,
"keep_classnames": false,
"keep_fargs": false,
"keep_fnames": false,
"keep_infinity": false,
"loops": false,
"negate_iife": false,
"properties": false,
"reduce_funcs": false,
"reduce_vars": false,
"side_effects": false,
"switches": false,
"typeofs": false,
"unsafe": false,
"unsafe_arrows": false,
"unsafe_comps": false,
"unsafe_Function": false,
"unsafe_math": false,
"unsafe_symbols": false,
"unsafe_methods": false,
"unsafe_proto": false,
"unsafe_regexp": false,
"unsafe_undefined": false,
"unused": false,
"const_to_let": false,
"pristine_globals": false
},
"mangle": false
}
},
"module": {
"type": "es6"
},
"minify": false,
"isModule": true
}
4 changes: 4 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7228/input/input.js
@@ -0,0 +1,4 @@
function f() {
const foos = something.getFoos();
return foos?.[0];
}
3 changes: 3 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7228/output/input.js
@@ -0,0 +1,3 @@
function f() {
return something.getFoos()?.[0];
}
4 changes: 4 additions & 0 deletions crates/swc_ecma_minifier/src/compress/optimize/props.rs
Expand Up @@ -195,6 +195,10 @@ where
pub(super) fn replace_props(&mut self, e: &mut Expr) {
let member = match e {
Expr::Member(m) => m,
Expr::OptChain(m) => match &mut *m.base {
OptChainBase::Member(m) => m,
_ => return,
},
_ => return,
};
if let Expr::Ident(obj) = &*member.obj {
Expand Down
47 changes: 47 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/7228/1/conifig.json
@@ -0,0 +1,47 @@
{
"arguments": false,
"arrows": false,
"booleans": false,
"booleans_as_integers": false,
"collapse_vars": false,
"comparisons": false,
"computed_props": false,
"conditionals": false,
"dead_code": false,
"directives": false,
"drop_console": false,
"drop_debugger": false,
"evaluate": false,
"expression": false,
"hoist_funs": false,
"hoist_props": true,
"hoist_vars": false,
"if_return": false,
"join_vars": false,
"keep_classnames": false,
"keep_fargs": false,
"keep_fnames": false,
"keep_infinity": false,
"loops": false,
"negate_iife": false,
"properties": false,
"reduce_funcs": false,
"reduce_vars": false,
"side_effects": false,
"switches": false,
"typeofs": false,
"unsafe": false,
"unsafe_arrows": false,
"unsafe_comps": false,
"unsafe_Function": false,
"unsafe_math": false,
"unsafe_symbols": false,
"unsafe_methods": false,
"unsafe_proto": false,
"unsafe_regexp": false,
"unsafe_undefined": false,
"unused": false,
"const_to_let": false,
"pristine_globals": false,
"defaults": true
}
4 changes: 4 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/7228/1/input.js
@@ -0,0 +1,4 @@
export function f() {
const foos = something.getFoos();
return foos?.[0];
}
@@ -0,0 +1,4 @@
export function f() {
const foos = something.getFoos();
return foos?.[0];
}

1 comment on commit a44fea1

@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: a44fea1 Previous: f0e3b1d Ratio
es/full/bugs-1 321627 ns/iter (± 16870) 293405 ns/iter (± 11815) 1.10
es/full/minify/libraries/antd 1562282824 ns/iter (± 22363391) 1553815340 ns/iter (± 20650409) 1.01
es/full/minify/libraries/d3 309762723 ns/iter (± 8618615) 302760721 ns/iter (± 6027602) 1.02
es/full/minify/libraries/echarts 1214217603 ns/iter (± 11172791) 1201064793 ns/iter (± 14532282) 1.01
es/full/minify/libraries/jquery 90816328 ns/iter (± 1518822) 90394766 ns/iter (± 620464) 1.00
es/full/minify/libraries/lodash 107733143 ns/iter (± 1883081) 104819610 ns/iter (± 1228118) 1.03
es/full/minify/libraries/moment 52807734 ns/iter (± 466518) 52227456 ns/iter (± 382148) 1.01
es/full/minify/libraries/react 19452493 ns/iter (± 355120) 18912023 ns/iter (± 80765) 1.03
es/full/minify/libraries/terser 244036265 ns/iter (± 3832527) 237841685 ns/iter (± 1730056) 1.03
es/full/minify/libraries/three 435998234 ns/iter (± 8855533) 418484077 ns/iter (± 3413038) 1.04
es/full/minify/libraries/typescript 2945507478 ns/iter (± 19015204) 2876485289 ns/iter (± 27712696) 1.02
es/full/minify/libraries/victory 647450600 ns/iter (± 12982972) 640869258 ns/iter (± 6779449) 1.01
es/full/minify/libraries/vue 130674464 ns/iter (± 1196927) 129212582 ns/iter (± 559562) 1.01
es/full/codegen/es3 28677 ns/iter (± 65) 28359 ns/iter (± 92) 1.01
es/full/codegen/es5 28866 ns/iter (± 70) 28533 ns/iter (± 55) 1.01
es/full/codegen/es2015 28792 ns/iter (± 66) 28505 ns/iter (± 125) 1.01
es/full/codegen/es2016 28821 ns/iter (± 102) 28497 ns/iter (± 30) 1.01
es/full/codegen/es2017 28767 ns/iter (± 53) 28458 ns/iter (± 130) 1.01
es/full/codegen/es2018 28761 ns/iter (± 68) 28211 ns/iter (± 62) 1.02
es/full/codegen/es2019 28738 ns/iter (± 39) 28315 ns/iter (± 122) 1.01
es/full/codegen/es2020 28800 ns/iter (± 84) 28289 ns/iter (± 159) 1.02
es/full/all/es3 184757716 ns/iter (± 2603690) 177380010 ns/iter (± 3297651) 1.04
es/full/all/es5 174877409 ns/iter (± 2234745) 173681366 ns/iter (± 2215956) 1.01
es/full/all/es2015 135586840 ns/iter (± 2275650) 135088567 ns/iter (± 1521635) 1.00
es/full/all/es2016 134439221 ns/iter (± 1540759) 131943735 ns/iter (± 2021923) 1.02
es/full/all/es2017 132618432 ns/iter (± 2122569) 129819665 ns/iter (± 906702) 1.02
es/full/all/es2018 128777947 ns/iter (± 1741175) 126179109 ns/iter (± 759846) 1.02
es/full/all/es2019 126836499 ns/iter (± 1404964) 123794082 ns/iter (± 1299203) 1.02
es/full/all/es2020 119890145 ns/iter (± 1634846) 116804863 ns/iter (± 1025793) 1.03
es/full/parser 516626 ns/iter (± 7334) 513383 ns/iter (± 7205) 1.01
es/full/base/fixer 22711 ns/iter (± 33) 22716 ns/iter (± 116) 1.00
es/full/base/resolver_and_hygiene 84982 ns/iter (± 167) 83113 ns/iter (± 261) 1.02
serialization of serde 125 ns/iter (± 0) 123 ns/iter (± 0) 1.02
css/minify/libraries/bootstrap 27740219 ns/iter (± 170878) 27463476 ns/iter (± 127463) 1.01
css/visitor/compare/clone 2102054 ns/iter (± 6027) 2132511 ns/iter (± 26220) 0.99
css/visitor/compare/visit_mut_span 2321407 ns/iter (± 9029) 2278829 ns/iter (± 12891) 1.02
css/visitor/compare/visit_mut_span_panic 2362299 ns/iter (± 5053) 2338728 ns/iter (± 25187) 1.01
css/visitor/compare/fold_span 3091433 ns/iter (± 12084) 3083250 ns/iter (± 8883) 1.00
css/visitor/compare/fold_span_panic 3264311 ns/iter (± 14972) 3220070 ns/iter (± 10083) 1.01
css/lexer/bootstrap_5_1_3 5134481 ns/iter (± 2971) 5140793 ns/iter (± 14545) 1.00
css/lexer/foundation_6_7_4 4334645 ns/iter (± 5976) 4305617 ns/iter (± 8982) 1.01
css/lexer/tailwind_3_1_1 822617 ns/iter (± 811) 812652 ns/iter (± 3449) 1.01
css/parser/bootstrap_5_1_3 21004371 ns/iter (± 160406) 20904122 ns/iter (± 139286) 1.00
css/parser/foundation_6_7_4 16710794 ns/iter (± 46687) 16669212 ns/iter (± 74998) 1.00
css/parser/tailwind_3_1_1 3240105 ns/iter (± 4425) 3215097 ns/iter (± 16984) 1.01
es/codegen/colors 328269 ns/iter (± 185596) 327663 ns/iter (± 185315) 1.00
es/codegen/large 1254198 ns/iter (± 658348) 1237986 ns/iter (± 642679) 1.01
es/codegen/with-parser/colors 47217 ns/iter (± 286) 47378 ns/iter (± 251) 1.00
es/codegen/with-parser/large 512148 ns/iter (± 1717) 508924 ns/iter (± 2585) 1.01
es/minify/libraries/antd 1342774017 ns/iter (± 17838871) 1327719590 ns/iter (± 17030034) 1.01
es/minify/libraries/d3 252237294 ns/iter (± 2716727) 247256109 ns/iter (± 1164884) 1.02
es/minify/libraries/echarts 1025233343 ns/iter (± 11360448) 1002629585 ns/iter (± 7736466) 1.02
es/minify/libraries/jquery 80150811 ns/iter (± 1502732) 77954881 ns/iter (± 756240) 1.03
es/minify/libraries/lodash 95368834 ns/iter (± 1200564) 93043504 ns/iter (± 897382) 1.02
es/minify/libraries/moment 46121629 ns/iter (± 438334) 45195742 ns/iter (± 293645) 1.02
es/minify/libraries/react 17200270 ns/iter (± 221050) 16880614 ns/iter (± 68635) 1.02
es/minify/libraries/terser 211084374 ns/iter (± 3538709) 205922514 ns/iter (± 1979632) 1.03
es/minify/libraries/three 357384225 ns/iter (± 5068194) 348213835 ns/iter (± 3490802) 1.03
es/minify/libraries/typescript 2494169630 ns/iter (± 15026270) 2475162640 ns/iter (± 10482907) 1.01
es/minify/libraries/victory 553995721 ns/iter (± 10930661) 527929146 ns/iter (± 2841263) 1.05
es/minify/libraries/vue 115366493 ns/iter (± 712142) 113514763 ns/iter (± 906452) 1.02
es/visitor/compare/clone 2315161 ns/iter (± 7852) 2313269 ns/iter (± 9290) 1.00
es/visitor/compare/visit_mut_span 2693103 ns/iter (± 3039) 2670596 ns/iter (± 7419) 1.01
es/visitor/compare/visit_mut_span_panic 2738488 ns/iter (± 3705) 2723669 ns/iter (± 9253) 1.01
es/visitor/compare/fold_span 3792718 ns/iter (± 5431) 3788092 ns/iter (± 21559) 1.00
es/visitor/compare/fold_span_panic 3926577 ns/iter (± 11462) 3927439 ns/iter (± 26393) 1.00
es/lexer/colors 13269 ns/iter (± 38) 13032 ns/iter (± 49) 1.02
es/lexer/angular 6364330 ns/iter (± 10092) 6318964 ns/iter (± 42463) 1.01
es/lexer/backbone 788193 ns/iter (± 925) 776403 ns/iter (± 2600) 1.02
es/lexer/jquery 4411043 ns/iter (± 4891) 4365476 ns/iter (± 21375) 1.01
es/lexer/jquery mobile 6891729 ns/iter (± 3733) 6810831 ns/iter (± 28402) 1.01
es/lexer/mootools 3466980 ns/iter (± 3097) 3441384 ns/iter (± 13749) 1.01
es/lexer/underscore 651874 ns/iter (± 563) 643500 ns/iter (± 1758) 1.01
es/lexer/three 20869632 ns/iter (± 37289) 20706845 ns/iter (± 94713) 1.01
es/lexer/yui 3868671 ns/iter (± 3058) 3825730 ns/iter (± 13113) 1.01
es/parser/colors 29324 ns/iter (± 39) 29042 ns/iter (± 151) 1.01
es/parser/angular 15042745 ns/iter (± 178688) 14763146 ns/iter (± 100946) 1.02
es/parser/backbone 2159993 ns/iter (± 10468) 2149872 ns/iter (± 11182) 1.00
es/parser/jquery 11713776 ns/iter (± 112865) 11586266 ns/iter (± 85764) 1.01
es/parser/jquery mobile 18298846 ns/iter (± 93563) 17930085 ns/iter (± 87467) 1.02
es/parser/mootools 8970302 ns/iter (± 30585) 8883797 ns/iter (± 30281) 1.01
es/parser/underscore 1823666 ns/iter (± 11212) 1807406 ns/iter (± 16747) 1.01
es/parser/three 53741207 ns/iter (± 371018) 51970765 ns/iter (± 675110) 1.03
es/parser/yui 9039571 ns/iter (± 70675) 8951258 ns/iter (± 123127) 1.01
es/preset-env/usage/builtin_type 141827 ns/iter (± 34729) 140195 ns/iter (± 34484) 1.01
es/preset-env/usage/property 20241 ns/iter (± 98) 19858 ns/iter (± 97) 1.02
es/resolver/typescript 110812529 ns/iter (± 3964694) 108249844 ns/iter (± 1958341) 1.02
es/fixer/typescript 79063631 ns/iter (± 549409) 76302204 ns/iter (± 569953) 1.04
es/hygiene/typescript 167250090 ns/iter (± 1448387) 165244778 ns/iter (± 1200456) 1.01
es/resolver_with_hygiene/typescript 303995859 ns/iter (± 2665938) 298881740 ns/iter (± 2518858) 1.02
es/visitor/base-perf/module_clone 81553 ns/iter (± 330) 80481 ns/iter (± 633) 1.01
es/visitor/base-perf/fold_empty 90573 ns/iter (± 285) 89638 ns/iter (± 791) 1.01
es/visitor/base-perf/fold_noop_impl_all 90666 ns/iter (± 467) 90169 ns/iter (± 581) 1.01
es/visitor/base-perf/fold_noop_impl_vec 90686 ns/iter (± 508) 90670 ns/iter (± 654) 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 42 ns/iter (± 0) 42 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 102 ns/iter (± 0) 102 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed 78 ns/iter (± 0) 77 ns/iter (± 0) 1.01
es/visitor/base-perf/visit_contains_this 3502 ns/iter (± 73) 3591 ns/iter (± 94) 0.98
es/base/parallel/resolver/typescript 5640906172 ns/iter (± 241261595) 5694497487 ns/iter (± 487269330) 0.99
es/base/parallel/hygiene/typescript 1983362158 ns/iter (± 39814403) 2002897884 ns/iter (± 19648338) 0.99
misc/visitors/time-complexity/time 5 98 ns/iter (± 0) 98 ns/iter (± 0) 1
misc/visitors/time-complexity/time 10 332 ns/iter (± 5) 328 ns/iter (± 1) 1.01
misc/visitors/time-complexity/time 15 655 ns/iter (± 19) 630 ns/iter (± 2) 1.04
misc/visitors/time-complexity/time 20 1228 ns/iter (± 22) 1210 ns/iter (± 15) 1.01
misc/visitors/time-complexity/time 40 6548 ns/iter (± 9) 6511 ns/iter (± 26) 1.01
misc/visitors/time-complexity/time 60 17185 ns/iter (± 105) 16824 ns/iter (± 124) 1.02
es/full-target/es2016 253822 ns/iter (± 568) 253372 ns/iter (± 838) 1.00
es/full-target/es2017 246893 ns/iter (± 342) 243801 ns/iter (± 498) 1.01
es/full-target/es2018 236584 ns/iter (± 485) 232943 ns/iter (± 1032) 1.02
es2020_nullish_coalescing 92950 ns/iter (± 280) 91603 ns/iter (± 482) 1.01
es2020_optional_chaining 124885 ns/iter (± 354) 123961 ns/iter (± 668) 1.01
es2022_class_properties 149840 ns/iter (± 253) 148682 ns/iter (± 602) 1.01
es2018_object_rest_spread 96810 ns/iter (± 124) 95013 ns/iter (± 528) 1.02
es2019_optional_catch_binding 86097 ns/iter (± 127) 83641 ns/iter (± 279) 1.03
es2017_async_to_generator 86399 ns/iter (± 221) 84336 ns/iter (± 378) 1.02
es2016_exponentiation 90574 ns/iter (± 270) 88773 ns/iter (± 528) 1.02
es2015_arrow 93994 ns/iter (± 306) 92089 ns/iter (± 422) 1.02
es2015_block_scoped_fn 92516 ns/iter (± 314) 91581 ns/iter (± 290) 1.01
es2015_block_scoping 170345 ns/iter (± 257) 169326 ns/iter (± 489) 1.01

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

Please sign in to comment.