From 985977b750d458d0ccbdff8b2b779224a917a66b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= <kdy1997.dev@gmail.com> Date: Mon, 2 Dec 2024 13:43:47 +0900 Subject: [PATCH] fix(es/minifier): Do not inline into the exact LHS (#9777) **Related issue:** - Closes https://github.com/swc-project/swc/issues/9739 --- .changeset/big-mails-kneel.md | 6 +++ .../src/compress/optimize/inline.rs | 4 ++ .../tests/fixture/issues/9739/config.json | 46 +++++++++++++++++++ .../tests/fixture/issues/9739/input.js | 2 + .../tests/fixture/issues/9739/output.js | 8 ++++ 5 files changed, 66 insertions(+) create mode 100644 .changeset/big-mails-kneel.md create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/9739/config.json create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/9739/input.js create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/9739/output.js diff --git a/.changeset/big-mails-kneel.md b/.changeset/big-mails-kneel.md new file mode 100644 index 000000000000..6aae8f1c4891 --- /dev/null +++ b/.changeset/big-mails-kneel.md @@ -0,0 +1,6 @@ +--- +swc_core: patch +swc_ecma_minifier: patch +--- + +fix(es/minifier): Do not inline into the exact LHS diff --git a/crates/swc_ecma_minifier/src/compress/optimize/inline.rs b/crates/swc_ecma_minifier/src/compress/optimize/inline.rs index 2456e01cd819..d8705cd9f443 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/inline.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/inline.rs @@ -789,6 +789,10 @@ impl Optimizer<'_> { /// Actually inlines variables. pub(super) fn inline(&mut self, e: &mut Expr) { + if self.ctx.is_exact_lhs_of_assign { + return; + } + match e { Expr::Member(me) => { if let MemberProp::Computed(prop) = &mut me.prop { diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/9739/config.json b/crates/swc_ecma_minifier/tests/fixture/issues/9739/config.json new file mode 100644 index 000000000000..e24c2f770eb5 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/9739/config.json @@ -0,0 +1,46 @@ +{ + "arguments": false, + "arrows": true, + "booleans": true, + "booleans_as_integers": false, + "collapse_vars": true, + "comparisons": true, + "computed_props": true, + "conditionals": true, + "dead_code": true, + "directives": true, + "drop_console": false, + "drop_debugger": true, + "evaluate": true, + "expression": false, + "hoist_funs": false, + "hoist_props": true, + "hoist_vars": false, + "if_return": true, + "join_vars": true, + "keep_classnames": false, + "keep_fargs": true, + "keep_fnames": false, + "keep_infinity": false, + "loops": true, + "negate_iife": true, + "properties": true, + "reduce_funcs": false, + "reduce_vars": false, + "side_effects": true, + "switches": true, + "typeofs": true, + "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": true, + "const_to_let": true, + "pristine_globals": true +} diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/9739/input.js b/crates/swc_ecma_minifier/tests/fixture/issues/9739/input.js new file mode 100644 index 000000000000..026bf482667d --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/9739/input.js @@ -0,0 +1,2 @@ +const arr = ['a', 'b']; +[arr[0], arr[1]] = [arr[1], arr[0]]; \ No newline at end of file diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/9739/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/9739/output.js new file mode 100644 index 000000000000..a3a2fde32767 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/9739/output.js @@ -0,0 +1,8 @@ +const arr = [ + 'a', + 'b' +]; +[arr[0], arr[1]] = [ + 'b', + 'a' +];