From 102241b812b8e815b59575178193bb71b4264bab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 11 Mar 2024 16:59:22 +0900 Subject: [PATCH] fix(es/minifier): Handle cyclic references while dropping unused properties (#8725) **Related issue:** - Closes #8714 --- .../fixture/issues-8xxx/8714/input/.swcrc | 65 +++++++++++++++++++ .../tests/fixture/issues-8xxx/8714/input/1.js | 5 ++ .../fixture/issues-8xxx/8714/output/1.js | 5 ++ .../src/compress/optimize/unused.rs | 2 +- .../tests/fixture/issues/8714/config.json | 3 + .../tests/fixture/issues/8714/input.js | 5 ++ .../tests/fixture/issues/8714/output.js | 5 ++ 7 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 crates/swc/tests/fixture/issues-8xxx/8714/input/.swcrc create mode 100644 crates/swc/tests/fixture/issues-8xxx/8714/input/1.js create mode 100644 crates/swc/tests/fixture/issues-8xxx/8714/output/1.js create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/8714/config.json create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/8714/input.js create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/8714/output.js diff --git a/crates/swc/tests/fixture/issues-8xxx/8714/input/.swcrc b/crates/swc/tests/fixture/issues-8xxx/8714/input/.swcrc new file mode 100644 index 000000000000..b4f4091fcd6d --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8714/input/.swcrc @@ -0,0 +1,65 @@ +{ + "jsc": { + "parser": { + "syntax": "ecmascript", + "jsx": false + }, + "target": "es2022", + "loose": false, + "minify": { + "compress": { + "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": false, + "const_to_let": true, + "pristine_globals": true, + "passes": 3 + }, + "mangle": false + } + }, + "module": { + "type": "es6" + }, + "minify": false, + "isModule": true +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-8xxx/8714/input/1.js b/crates/swc/tests/fixture/issues-8xxx/8714/input/1.js new file mode 100644 index 000000000000..88dbc6ebb60b --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8714/input/1.js @@ -0,0 +1,5 @@ +const foo = { + x: 1, + y: () => foo +}; +console.log(foo.y().x); // should log: 1 \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-8xxx/8714/output/1.js b/crates/swc/tests/fixture/issues-8xxx/8714/output/1.js new file mode 100644 index 000000000000..613ae0f8677f --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8714/output/1.js @@ -0,0 +1,5 @@ +const foo = { + x: 1, + y: ()=>foo +}; +console.log(foo.y().x); diff --git a/crates/swc_ecma_minifier/src/compress/optimize/unused.rs b/crates/swc_ecma_minifier/src/compress/optimize/unused.rs index 431316f6b258..14b810be9d64 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/unused.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/unused.rs @@ -793,7 +793,7 @@ impl Optimizer<'_> { let usage = self.data.vars.get(&name.to_id())?; - if usage.indexed_with_dynamic_key || usage.used_as_ref { + if usage.indexed_with_dynamic_key || usage.used_as_ref || usage.used_recursively { return None; } diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/8714/config.json b/crates/swc_ecma_minifier/tests/fixture/issues/8714/config.json new file mode 100644 index 000000000000..ee65e9fdc67e --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/8714/config.json @@ -0,0 +1,3 @@ +{ + "defaults": true +} diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/8714/input.js b/crates/swc_ecma_minifier/tests/fixture/issues/8714/input.js new file mode 100644 index 000000000000..c9d684029e7d --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/8714/input.js @@ -0,0 +1,5 @@ +const foo = { + x: 1, + y: () => foo +}; +console.log(foo.y().x); \ No newline at end of file diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/8714/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/8714/output.js new file mode 100644 index 000000000000..613ae0f8677f --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/8714/output.js @@ -0,0 +1,5 @@ +const foo = { + x: 1, + y: ()=>foo +}; +console.log(foo.y().x);