diff --git a/crates/swc_ecma_minifier/src/compress/optimize/unused.rs b/crates/swc_ecma_minifier/src/compress/optimize/unused.rs index 14b810be9d64..79ebff51d8f3 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/unused.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/unused.rs @@ -345,25 +345,22 @@ impl Optimizer<'_> { } Pat::Array(arr) => { - for (idx, elem) in arr.elems.iter_mut().enumerate() { - match elem { + for (idx, arr_elem) in arr.elems.iter_mut().enumerate() { + match arr_elem { Some(p) => { - if p.is_ident() { - continue; - } - let elem = init .as_mut() .and_then(|expr| self.access_numeric_property(expr, idx)); self.take_pat_if_unused(p, elem, is_var_decl); + + if p.is_invalid() { + *arr_elem = None; + } } None => {} } } - - arr.elems - .retain(|elem| !matches!(elem, Some(Pat::Invalid(..)))) } Pat::Object(obj) => { diff --git a/crates/swc_ecma_minifier/tests/TODO.txt b/crates/swc_ecma_minifier/tests/TODO.txt index 2031e7c8c43e..cec001dfbdf4 100644 --- a/crates/swc_ecma_minifier/tests/TODO.txt +++ b/crates/swc_ecma_minifier/tests/TODO.txt @@ -184,7 +184,6 @@ harmony/issue_2874_2/input.js harmony/module_enabled/input.js harmony/module_mangle_scope/input.js harmony/regression_cannot_use_of/input.js -hoist_props/contains_this_3/input.js hoist_props/hoist_function_with_call/input.js if_return/if_return_same_value/input.js if_return/if_var_return/input.js diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/8670/config.json b/crates/swc_ecma_minifier/tests/fixture/issues/8670/config.json new file mode 100644 index 000000000000..b15be3b3e06b --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/8670/config.json @@ -0,0 +1,5 @@ +{ + "defaults": true, + "pure_getters": true, + "toplevel": true +} diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/8670/input.js b/crates/swc_ecma_minifier/tests/fixture/issues/8670/input.js new file mode 100644 index 000000000000..7b0444cf7412 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/8670/input.js @@ -0,0 +1,2 @@ +const [a, b, c, d, e] = [1, 2, 3, 4, 5] +console.log(c) \ No newline at end of file diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/8670/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/8670/output.js new file mode 100644 index 000000000000..482e2841b0ed --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/8670/output.js @@ -0,0 +1,8 @@ +const [, , c, , ] = [ + 1, + 2, + 3, + 4, + 5 +]; +console.log(c); diff --git a/crates/swc_ecma_minifier/tests/passing.txt b/crates/swc_ecma_minifier/tests/passing.txt index f6a47e6515ce..d3f2f33b63db 100644 --- a/crates/swc_ecma_minifier/tests/passing.txt +++ b/crates/swc_ecma_minifier/tests/passing.txt @@ -739,6 +739,7 @@ hoist/hoist_no_destructurings/input.js hoist/hoist_vars/input.js hoist_props/contains_this_1/input.js hoist_props/contains_this_2/input.js +hoist_props/contains_this_3/input.js hoist_props/direct_access_1/input.js hoist_props/direct_access_2/input.js hoist_props/direct_access_3/input.js diff --git a/crates/swc_ecma_minifier/tests/terser/compress/destructuring/unused_destructuring_declaration_complex_1/output.js b/crates/swc_ecma_minifier/tests/terser/compress/destructuring/unused_destructuring_declaration_complex_1/output.js index 816d1b56097d..be76f977eb06 100644 --- a/crates/swc_ecma_minifier/tests/terser/compress/destructuring/unused_destructuring_declaration_complex_1/output.js +++ b/crates/swc_ecma_minifier/tests/terser/compress/destructuring/unused_destructuring_declaration_complex_1/output.js @@ -1,2 +1,10 @@ -const [, w, , x, { z: z }] = [1, 2, 3, 4, { z: 5 }]; +const [, , , x, { z: z }] = [ + 1, + 2, + 3, + 4, + { + z: 5 + } +]; console.log(x, z);