From c549ee89b9a0641ea78f57472168963811c7e111 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Sat, 27 Feb 2021 20:41:21 +0000 Subject: [PATCH] fix corner case `reduce_vars` (#4706) fixes #4705 --- lib/compress.js | 52 +++++++++++++++++++++------------------- test/compress/classes.js | 21 ++++++++++++++++ 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 101fdb4e..ba7ab4a0 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -938,31 +938,35 @@ merge(Compressor.prototype, { node.variables.each(function(def) { reset_def(tw, compressor, def); }); - if (!node.name) return; - var d = node.name.definition(); - var parent = tw.parent(); - if (parent instanceof AST_ExportDeclaration || parent instanceof AST_ExportDefault) d.single_use = false; - if (safe_to_assign(tw, d, true)) { - mark(tw, d); - tw.loop_ids[d.id] = tw.in_loop; - d.fixed = function() { - return node; - }; - d.fixed.assigns = [ node ]; - if (!is_safe_lexical(d)) d.single_use = false; - } else { - d.fixed = false; - } - }); - def(AST_ClassField, function(tw) { - var node = this; - if (node.static) return; - if (node.key instanceof AST_Node) node.key.walk(tw); - if (node.value) { - push(tw); - node.value.walk(tw); - pop(tw); + if (node.extends) node.extends.walk(tw); + if (node.name) { + var d = node.name.definition(); + var parent = tw.parent(); + if (parent instanceof AST_ExportDeclaration || parent instanceof AST_ExportDefault) d.single_use = false; + if (safe_to_assign(tw, d, true)) { + mark(tw, d); + tw.loop_ids[d.id] = tw.in_loop; + d.fixed = function() { + return node; + }; + d.fixed.assigns = [ node ]; + if (!is_safe_lexical(d)) d.single_use = false; + } else { + d.fixed = false; + } } + node.properties.filter(function(prop) { + if (prop.key instanceof AST_Node) prop.key.walk(tw); + return prop.value; + }).forEach(function(prop) { + if (prop.static) { + prop.value.walk(tw); + } else { + push(tw); + prop.value.walk(tw); + pop(tw); + } + }); return true; }); def(AST_Conditional, function(tw) { diff --git a/test/compress/classes.js b/test/compress/classes.js index ab2652c8..dea0d5b0 100644 --- a/test/compress/classes.js +++ b/test/compress/classes.js @@ -747,3 +747,24 @@ issue_4687_2: { expect_stdout: "PASS" node_version: ">=4" } + +issue_4705: { + options = { + evaluate: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var a = "PASS"; + class A { + p = a = "FAIL"; + [console.log(a)]; + } + } + expect: { + console.log("PASS"); + } + expect_stdout: "PASS" + node_version: ">=12" +} -- 2.34.1