fix up drop_unused()

This commit is contained in:
alexlamsl
2017-02-27 05:11:01 +08:00
parent 88a338f29e
commit b3a987b0df

View File

@@ -1569,7 +1569,6 @@ merge(Compressor.prototype, {
if (compressor.has_directive("use asm")) return self; if (compressor.has_directive("use asm")) return self;
var toplevel = compressor.option("toplevel"); var toplevel = compressor.option("toplevel");
if (compressor.option("unused") if (compressor.option("unused")
&& (!(self instanceof AST_Toplevel) || toplevel)
&& !self.uses_eval && !self.uses_eval
&& !self.uses_with) { && !self.uses_with) {
var assign_as_unused = !/keep_assign/.test(compressor.option("unused")); var assign_as_unused = !/keep_assign/.test(compressor.option("unused"));
@@ -1596,16 +1595,14 @@ merge(Compressor.prototype, {
var scope = this; var scope = this;
var tw = new TreeWalker(function(node, descend){ var tw = new TreeWalker(function(node, descend){
if (node !== self) { if (node !== self) {
if (node instanceof AST_Defun) { if (node instanceof AST_Defun || node instanceof AST_DefClass) {
if (!drop_funcs && scope === self) { if (!drop_funcs && scope === self) {
var node_def = node.name.definition(); 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_ids[node_def.id] = true;
in_use.push(node_def); in_use.push(node_def);
} }
} }
}
if (node instanceof AST_Defun || node instanceof AST_DefClass) {
initializations.add(node.name.name, node); initializations.add(node.name.name, node);
return true; // don't go in nested scopes return true; // don't go in nested scopes
} }
@@ -1613,7 +1610,7 @@ merge(Compressor.prototype, {
node.definitions.forEach(function(def){ node.definitions.forEach(function(def){
if (!drop_vars) { if (!drop_vars) {
var node_def = def.name.definition(); 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_ids[node_def.id] = true;
in_use.push(node_def); 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) { if ((node instanceof AST_Defun || node instanceof AST_DefClass) && node !== self) {
var keep = (node.name.definition().id in in_use_ids) || node.name.definition().global; var keep = (node.name.definition().id in in_use_ids) || !drop_funcs && node.name.definition().global;
if (!keep) { if (!keep) {
compressor.warn("Dropping unused function {name} [{file}:{line},{col}]", { compressor.warn("Dropping unused function {name} [{file}:{line},{col}]", {
name : node.name.name, name : node.name.name,
@@ -1767,11 +1764,11 @@ merge(Compressor.prototype, {
} }
return node; 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){ var def = node.definitions.filter(function(def){
if (def.is_destructuring()) return true; if (def.is_destructuring()) return true;
if (def.name.definition().id in in_use_ids) 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 = { var w = {
name : def.name.name, name : def.name.name,
@@ -1833,12 +1830,14 @@ merge(Compressor.prototype, {
} }
return node; return node;
} }
if (drop_vars && assign_as_unused if (assign_as_unused
&& node instanceof AST_Assign && node instanceof AST_Assign
&& node.operator == "=" && node.operator == "="
&& node.left instanceof AST_SymbolRef) { && node.left instanceof AST_SymbolRef) {
var def = node.left.definition(); 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; return node.right;
} }
} }