From fbc5ecf75a007e699d3682c7f4dbd90386a6e3ca Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Sat, 19 Feb 2022 18:26:51 +0000 Subject: [PATCH] fix corner case in `unused` (#5361) fixes #5360 --- lib/compress.js | 31 ++++++++++++++++++++++++++----- test/compress/rests.js | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 6070f1ff13..dd0edd5a63 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -7734,16 +7734,37 @@ Compressor.prototype.compress = function(node) { return prop.key instanceof AST_Node && prop.key.has_side_effects(compressor); } + function clear_write_only(node) { + if (node instanceof AST_Assign) { + node.write_only = false; + clear_write_only(node.right); + } else if (node instanceof AST_Binary) { + if (!lazy_op[node.operator]) return; + clear_write_only(node.left); + clear_write_only(node.right); + } else if (node instanceof AST_Conditional) { + clear_write_only(node.consequent); + clear_write_only(node.alternative); + } else if (node instanceof AST_Sequence) { + clear_write_only(node.tail_node()); + } else if (node instanceof AST_Unary) { + node.write_only = false; + } + } + function retain_lhs(node) { if (node instanceof AST_DefaultValue) return retain_lhs(node.name); if (node instanceof AST_Destructured) { if (value === null) { value = make_node(AST_Number, node, { value: 0 }); - } else if (value && (value.tail_node().write_only === true - || value.may_throw_on_access(compressor, true))) { - value = make_node(AST_Array, node, { - elements: value instanceof AST_Sequence ? value.expressions : [ value ], - }); + } else if (value) { + if (value.may_throw_on_access(compressor, true)) { + value = make_node(AST_Array, node, { + elements: value instanceof AST_Sequence ? value.expressions : [ value ], + }); + } else { + clear_write_only(value); + } } return make_node(AST_DestructuredObject, node, { properties: [] }); } diff --git a/test/compress/rests.js b/test/compress/rests.js index 5a79d5c15c..d32cf2aaa2 100644 --- a/test/compress/rests.js +++ b/test/compress/rests.js @@ -1049,7 +1049,9 @@ issue_5100_1: { p: {}, ...a } = [ { - p: [ a = 42["q"] ], + p: { + q: a, + } = 42, r: "PASS", } ][0]); console.log(a.r); @@ -1082,7 +1084,9 @@ issue_5100_2: { p: {}, ...a } = [ { - p: [ console.log("PASS"), a = 42["q"] ], + p: (console.log("PASS"), { + q: a, + } = 42), } ][0]); } expect_stdout: "PASS" @@ -1267,3 +1271,31 @@ issue_5246_3: { expect_stdout: "PASS" node_version: ">=6" } + +issue_5360: { + options = { + keep_fargs: false, + pure_getters: "strict", + unused: true, + } + input: { + var a; + console.log(function({ p: {}, ...b }) { + return b.q; + }({ + p: ~a && ([ a ] = []), + q: "PASS", + })); + } + expect: { + var a; + console.log(function({ p: {}, ...b }) { + return b.q; + }({ + p: ~a && ([ a ] = []), + q: "PASS", + })); + } + expect_stdout: "PASS" + node_version: ">=8.3.0" +}