diff --git a/lib/compress.js b/lib/compress.js index 2b63851b..c55cf115 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1569,7 +1569,6 @@ merge(Compressor.prototype, { if (compressor.has_directive("use asm")) return self; var toplevel = compressor.option("toplevel"); if (compressor.option("unused") - && (!(self instanceof AST_Toplevel) || toplevel) && !self.uses_eval && !self.uses_with) { var assign_as_unused = !/keep_assign/.test(compressor.option("unused")); @@ -1596,16 +1595,14 @@ merge(Compressor.prototype, { var scope = this; var tw = new TreeWalker(function(node, descend){ if (node !== self) { - if (node instanceof AST_Defun) { + if (node instanceof AST_Defun || node instanceof AST_DefClass) { if (!drop_funcs && scope === self) { var node_def = node.name.definition(); - if (!(node_def.id in in_use_ids)) { + if (node_def.global && !(node_def.id in in_use_ids)) { in_use_ids[node_def.id] = true; in_use.push(node_def); } } - } - if (node instanceof AST_Defun || node instanceof AST_DefClass) { initializations.add(node.name.name, node); return true; // don't go in nested scopes } @@ -1613,7 +1610,7 @@ merge(Compressor.prototype, { node.definitions.forEach(function(def){ if (!drop_vars) { var node_def = def.name.definition(); - if (!(node_def.id in in_use_ids)) { + if (node_def.global && !(node_def.id in in_use_ids)) { in_use_ids[node_def.id] = true; in_use.push(node_def); } @@ -1754,8 +1751,8 @@ merge(Compressor.prototype, { } } } - if (drop_funcs && (node instanceof AST_Defun || node instanceof AST_DefClass) && node !== self) { - var keep = (node.name.definition().id in in_use_ids) || node.name.definition().global; + if ((node instanceof AST_Defun || node instanceof AST_DefClass) && node !== self) { + var keep = (node.name.definition().id in in_use_ids) || !drop_funcs && node.name.definition().global; if (!keep) { compressor.warn("Dropping unused function {name} [{file}:{line},{col}]", { name : node.name.name, @@ -1767,11 +1764,11 @@ merge(Compressor.prototype, { } return node; } - if (drop_vars && node instanceof AST_Definitions && !(tt.parent() instanceof AST_ForIn)) { + if (node instanceof AST_Definitions && !(tt.parent() instanceof AST_ForIn)) { var def = node.definitions.filter(function(def){ if (def.is_destructuring()) return true; if (def.name.definition().id in in_use_ids) return true; - if (def.name.definition().global) return true; + if (!drop_vars && def.name.definition().global) return true; var w = { name : def.name.name, @@ -1833,12 +1830,14 @@ merge(Compressor.prototype, { } return node; } - if (drop_vars && assign_as_unused + if (assign_as_unused && node instanceof AST_Assign && node.operator == "=" && node.left instanceof AST_SymbolRef) { var def = node.left.definition(); - if (!(def.id in in_use_ids) && self.variables.get(def.name) === def) { + if ((drop_vars || !def.global) + && !(def.id in in_use_ids) + && self.variables.get(def.name) === def) { return node.right; } }