From 176c09c6a5408ef0a8ddca8da7eb930c9d5e2745 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Tue, 13 Oct 2020 00:32:17 +0100 Subject: [PATCH] fix corner case in `reduce_vars` & `unused` (#4208) fixes #4207 --- lib/compress.js | 17 ++++++++--------- test/compress/const.js | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index bc01ebc3..c59e26ed 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -165,10 +165,12 @@ Compressor.prototype = new TreeTransformer; merge(Compressor.prototype, { option: function(key) { return this.options[key] }, exposed: function(def) { - if (def.global) for (var i = 0; i < def.orig.length; i++) - if (!this.toplevel[def.orig[i] instanceof AST_SymbolDefun ? "funcs" : "vars"]) - return true; - return def.undeclared; + if (def.undeclared) return true; + if (!(def.global || def.scope.resolve() instanceof AST_Toplevel)) return false; + var toplevel = this.toplevel; + return !all(def.orig, function(sym) { + return toplevel[sym instanceof AST_SymbolDefun ? "funcs" : "vars"]; + }); }, compress: function(node) { node = node.resolve_defines(this); @@ -6642,13 +6644,10 @@ merge(Compressor.prototype, { var node = defn.name; if (!node.fixed_value()) return false; var def = node.definition(); + if (compressor.exposed(def)) return false; var scope = def.scope.resolve(); - if (scope instanceof AST_Toplevel) { - if (!compressor.toplevel.vars) return false; - if (def.scope === scope) return true; - return !scope.variables.has(node.name) && !scope.globals.has(node.name); - } if (def.scope === scope) return true; + if (scope instanceof AST_Toplevel) return !scope.variables.has(node.name) && !scope.globals.has(node.name); var s = def.scope; do { s = s.parent_scope; diff --git a/test/compress/const.js b/test/compress/const.js index d1164cc1..aedfdbc3 100644 --- a/test/compress/const.js +++ b/test/compress/const.js @@ -909,3 +909,24 @@ issue_4205: { } expect_stdout: true } + +issue_4207: { + options = { + reduce_funcs: true, + reduce_vars: true, + unused: true, + } + input: { + { + const a = function() {}; + console.log(a.length); + } + } + expect: { + { + const a = function() {}; + console.log(a.length); + } + } + expect_stdout: "0" +} -- 2.34.1