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'
+];