From c32fe26b8d9b7a8fc9ddbd0e6771a0e2af40365b Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Tue, 9 Aug 2022 03:18:11 +0100 Subject: [PATCH] fix corner case in `merge_vars` (#5609) --- lib/compress.js | 13 ++++++------- test/compress/default-values.js | 28 +++++++++++++++++++++++++++- test/compress/destructured.js | 9 ++++----- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 05554ebbf66..1882b44278a 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -6474,16 +6474,13 @@ Compressor.prototype.compress = function(node) { } else { assigned = segment.block instanceof AST_ForEnumeration && segment.block.init === tw.parent(); } - node.name.mark_symbol(assigned ? function(node) { - if (!(node instanceof AST_SymbolDeclaration)) return; + walk_destructured(AST_SymbolDeclaration, assigned ? function(node) { if (node instanceof AST_SymbolVar) { mark(node); } else { references[node.definition().id] = false; } - return true; } : function(node) { - if (!(node instanceof AST_SymbolDeclaration)) return; var id = node.definition().id; if (!(node instanceof AST_SymbolVar)) { references[id] = false; @@ -6492,8 +6489,7 @@ Compressor.prototype.compress = function(node) { } else if (references[id]) { references[id].push(node); } - return true; - }, tw); + }, node.name); return true; } if (node instanceof AST_While) { @@ -6613,13 +6609,16 @@ Compressor.prototype.compress = function(node) { pop(); node.name.walk(marker); } else if (node instanceof AST_DestructuredKeyVal) { - if (node.key instanceof AST_Node) { + if (!(node.key instanceof AST_Node)) { + node.value.walk(marker); + } else if (node.value instanceof AST_PropAccess) { push(); segment.block = node; node.key.walk(tw); node.value.walk(marker); pop(); } else { + node.key.walk(tw); node.value.walk(marker); } } else if (node instanceof symbol_type) { diff --git a/test/compress/default-values.js b/test/compress/default-values.js index 14ed687003b..afc296fe189 100644 --- a/test/compress/default-values.js +++ b/test/compress/default-values.js @@ -1718,7 +1718,7 @@ issue_4540: { node_version: ">=6" } -issue_4548: { +issue_4548_1: { options = { merge_vars: true, toplevel: true, @@ -1744,6 +1744,32 @@ issue_4548: { node_version: ">=6" } +issue_4548_2: { + options = { + merge_vars: true, + toplevel: true, + } + input: { + A = "foo"; + var a = A; + var [ b = c = "bar" ] = [ console, console.log(a) ]; + console.log(c); + var c; + } + expect: { + A = "foo"; + var a = A; + var [ b = c = "bar" ] = [ console, console.log(a) ]; + console.log(c); + var c; + } + expect_stdout: [ + "foo", + "undefined", + ] + node_version: ">=6" +} + issue_4588_1_unused: { options = { unused: true, diff --git a/test/compress/destructured.js b/test/compress/destructured.js index 816403181ae..487685f18ed 100644 --- a/test/compress/destructured.js +++ b/test/compress/destructured.js @@ -1902,8 +1902,8 @@ issue_4288: { console.log(typeof b); }()]: a, }) { - var b = a; - b++; + var a = a; + a++; } f(0); } @@ -2076,17 +2076,16 @@ issue_4312: { console.log(a); } expect: { - var a; b = "PASS", c = "FAIL", [ { - [a = b]: d, + [c = b]: d, }, ] = [ c && c ], void 0; var b, c, d; - console.log(a); + console.log(c); } expect_stdout: "PASS" node_version: ">=6"