From 87c9edbbc74e87fc0cd6a6af54890376d6669ddd Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Mon, 17 Jun 2024 04:36:02 +0300 Subject: [PATCH] fix corner case in `unused` (#5847) fixes #5843 --- lib/compress.js | 6 +++- test/compress/default-values.js | 2 +- test/compress/destructured.js | 55 +++++++++++++++++++++++++++++++-- test/compress/exports.js | 2 +- test/compress/yields.js | 2 +- 5 files changed, 61 insertions(+), 6 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 491f26d0..e161f46d 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -8284,6 +8284,7 @@ Compressor.prototype.compress = function(node) { if (prop instanceof AST_Spread) return prop; var key = prop_keys[index]; if (key instanceof AST_Node) return prop; + if (key === "__proto__") return prop; if (drop_keys.has(key)) { var mapped = drop_keys.get(key); if (!mapped) return prop; @@ -8317,7 +8318,10 @@ Compressor.prototype.compress = function(node) { if (value.has_side_effects(compressor) && prop.value.match_symbol(function(node) { return node instanceof AST_PropAccess; })) break; - value = make_node(AST_Sub, node, { + value = is_identifier_string(prop.key) ? make_node(AST_Dot, node, { + expression: value, + property: prop.key, + }) : make_node(AST_Sub, node, { expression: value, property: make_node_from_constant(prop.key, prop), }); diff --git a/test/compress/default-values.js b/test/compress/default-values.js index 4a248d99..aa83b521 100644 --- a/test/compress/default-values.js +++ b/test/compress/default-values.js @@ -2293,7 +2293,7 @@ issue_5340_3: { } expect: { var a; - (function() {})(a = true["p"]); + (function() {})(a = true.p); console.log(a); } expect_stdout: "undefined" diff --git a/test/compress/destructured.js b/test/compress/destructured.js index e051541a..55932111 100644 --- a/test/compress/destructured.js +++ b/test/compress/destructured.js @@ -1382,7 +1382,7 @@ side_effects_object: { } } expect: { - var a = null, c = (console, 42["c"]); + var a = null, c = (console, 42..c); try { c[a = "PASS"]; } catch (e) { @@ -1684,7 +1684,7 @@ singleton_1: { expect: { var b, a = "P"[0], o = {}; o.p = [ "FAIL"["1"] ][0]; - o.q = { foo: "S"[0] }["foo"]; + o.q = { foo: "S"[0] }.foo; [ b = "S" ] = []; console.log(a + o.p + o.q + b); } @@ -3886,3 +3886,54 @@ issue_5651: { expect_stdout: true node_version: ">=6" } + +issue_5843_1: { + options = { + unused: true, + } + input: { + var { p: a } = { + __proto__: { + p: "PASS", + }, + }; + console.log(a); + } + expect: { + var a = { + __proto__: { + p: "PASS", + }, + }.p; + console.log(a); + } + expect_stdout: "PASS" + node_version: ">=6" +} + +issue_5843_2: { + options = { + side_effects: true, + unused: true, + } + input: { + var a; + ({ p: a } = { + __proto__: { + p: "PASS", + }, + }); + console.log(a); + } + expect: { + var a; + a = { + __proto__: { + p: "PASS", + }, + }.p; + console.log(a); + } + expect_stdout: "PASS" + node_version: ">=6" +} diff --git a/test/compress/exports.js b/test/compress/exports.js index 236a8af4..8523c7f8 100644 --- a/test/compress/exports.js +++ b/test/compress/exports.js @@ -260,7 +260,7 @@ hoist_exports_2: { } } expect: { - let e, a = 42["foo"]; + let e, a = 42..foo; function f(t, { [e]: o }) { t(o, f); } diff --git a/test/compress/yields.js b/test/compress/yields.js index 933fc295..ab850f06 100644 --- a/test/compress/yields.js +++ b/test/compress/yields.js @@ -1386,7 +1386,7 @@ issue_5076_1: { expect: { var a; console.log("PASS"), - a = 42["a"]; + a = 42..a; } expect_stdout: "PASS" node_version: ">=6"