From 77da7cf24bad5064206ab3e6dc248012d08576cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 29 Jul 2024 12:23:20 +0900 Subject: [PATCH] fix(es/minifier): Fix detection of `this` (#9339) **Related issue:** - Closes https://github.com/swc-project/swc/issues/9148 --- .changeset/wicked-pandas-lick.md | 5 +++ .../src/compress/optimize/unused.rs | 32 +++++++++++++++++++ .../tests/fixture/issues/8643/output.js | 6 ++++ .../tests/fixture/issues/9148/input.js | 16 ++++++++++ .../tests/fixture/issues/9148/output.js | 14 ++++++++ .../hoist_props/contains_this_1/output.js | 8 ++++- 6 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 .changeset/wicked-pandas-lick.md create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/9148/input.js create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/9148/output.js diff --git a/.changeset/wicked-pandas-lick.md b/.changeset/wicked-pandas-lick.md new file mode 100644 index 000000000000..065723c8b758 --- /dev/null +++ b/.changeset/wicked-pandas-lick.md @@ -0,0 +1,5 @@ +--- +swc_ecma_minifier: patch +--- + +fix(es/minifier): Fix detection of `this` diff --git a/crates/swc_ecma_minifier/src/compress/optimize/unused.rs b/crates/swc_ecma_minifier/src/compress/optimize/unused.rs index 2460f92ebc06..f8a74dd55712 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/unused.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/unused.rs @@ -846,6 +846,38 @@ impl Optimizer<'_> { PropOrSpread::Prop(prop) => prop, }; + match &**prop { + Prop::Method(prop) => { + if contains_this_expr(&prop.function.body) { + return None; + } + } + Prop::Getter(prop) => { + if contains_this_expr(&prop.body) { + return None; + } + } + Prop::Setter(prop) => { + if contains_this_expr(&prop.body) { + return None; + } + } + Prop::KeyValue(prop) => match &*prop.value { + Expr::Fn(f) => { + if contains_this_expr(&f.function.body) { + return None; + } + } + Expr::Arrow(f) => { + if contains_this_expr(&f.body) { + return None; + } + } + _ => {} + }, + _ => {} + } + if contains_this_expr(prop) { return None; } diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/8643/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/8643/output.js index 77bd2e581726..2383456174bf 100644 --- a/crates/swc_ecma_minifier/tests/fixture/issues/8643/output.js +++ b/crates/swc_ecma_minifier/tests/fixture/issues/8643/output.js @@ -8,6 +8,12 @@ const Cache = { get: function(key) { if (!1 !== this.enabled) // console.log( 'THREE.Cache', 'Checking key:', key ); return this.files[key]; + }, + remove: function(key) { + delete this.files[key]; + }, + clear: function() { + this.files = {}; } }; class Loader { diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/9148/input.js b/crates/swc_ecma_minifier/tests/fixture/issues/9148/input.js new file mode 100644 index 000000000000..b60597f8f335 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/9148/input.js @@ -0,0 +1,16 @@ +function foo() { + const obj = { + clear: function () { + console.log('clear') + }, + start: function () { + const _this = this; + setTimeout(function () { + _this.clear(); + }); + } + }; + return () => obj.start() +}; + +export default foo() \ No newline at end of file diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/9148/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/9148/output.js new file mode 100644 index 000000000000..9c6db76fcaaa --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/9148/output.js @@ -0,0 +1,14 @@ +export default (function() { + const obj = { + clear: function() { + console.log('clear'); + }, + start: function() { + const _this = this; + setTimeout(function() { + _this.clear(); + }); + } + }; + return ()=>obj.start(); +})(); diff --git a/crates/swc_ecma_minifier/tests/terser/compress/hoist_props/contains_this_1/output.js b/crates/swc_ecma_minifier/tests/terser/compress/hoist_props/contains_this_1/output.js index 76f60763a8db..ca168451f516 100644 --- a/crates/swc_ecma_minifier/tests/terser/compress/hoist_props/contains_this_1/output.js +++ b/crates/swc_ecma_minifier/tests/terser/compress/hoist_props/contains_this_1/output.js @@ -1 +1,7 @@ -console.log(1, 1); +var o = { + u: function() { + return this === this; + }, + p: 1 +}; +console.log(o.p, o.p);