@@ -1542,7 +1542,7 @@ merge(Compressor.prototype, {
|
||||
&& (scan_lhs && lhs.equivalent_to(node)
|
||||
|| scan_rhs && (hit_rhs = scan_rhs(node, this)))) {
|
||||
if (!can_replace || stop_if_hit && (hit_rhs || !lhs_local || !replace_all)) {
|
||||
if (!hit_rhs || !value_def) abort = true;
|
||||
if (!hit_rhs && !value_def) abort = true;
|
||||
return node;
|
||||
}
|
||||
if (is_lhs(node, parent)) {
|
||||
@@ -1595,14 +1595,28 @@ merge(Compressor.prototype, {
|
||||
can_replace = false;
|
||||
descend(node, scanner);
|
||||
can_replace = replace;
|
||||
return node;
|
||||
return signal_abort(node);
|
||||
}
|
||||
// Scan but don't replace inside destructuring LHS
|
||||
if (node instanceof AST_Assign && node.left instanceof AST_Destructured) {
|
||||
var replace = can_replace;
|
||||
can_replace = false;
|
||||
node.left = node.left.transform(scanner);
|
||||
can_replace = replace;
|
||||
node.right = node.right.transform(scanner);
|
||||
return signal_abort(node);
|
||||
}
|
||||
// Scan but don't replace inside default value
|
||||
if (node instanceof AST_DefaultValue) {
|
||||
node.name = node.name.transform(scanner);
|
||||
var replace = can_replace;
|
||||
can_replace = false;
|
||||
node.value = node.value.transform(scanner);
|
||||
can_replace = replace;
|
||||
return signal_abort(node);
|
||||
}
|
||||
return handle_custom_scan_order(node, scanner);
|
||||
}, function(node) {
|
||||
if (abort) return;
|
||||
if (stop_after === node) abort = true;
|
||||
if (stop_if_hit === node) stop_if_hit = null;
|
||||
});
|
||||
}, signal_abort);
|
||||
var multi_replacer = new TreeTransformer(function(node) {
|
||||
if (abort) return node;
|
||||
// Skip nodes before `candidate` as quickly as possible
|
||||
@@ -1723,6 +1737,13 @@ merge(Compressor.prototype, {
|
||||
}
|
||||
}
|
||||
|
||||
function signal_abort(node) {
|
||||
if (abort) return node;
|
||||
if (stop_after === node) abort = true;
|
||||
if (stop_if_hit === node) stop_if_hit = null;
|
||||
return node;
|
||||
}
|
||||
|
||||
function handle_custom_scan_order(node, tt) {
|
||||
if (!(node instanceof AST_BlockScope)) return;
|
||||
// Skip (non-executed) functions
|
||||
@@ -1760,6 +1781,13 @@ merge(Compressor.prototype, {
|
||||
}
|
||||
}
|
||||
|
||||
function is_direct_assignment(node, parent) {
|
||||
if (parent instanceof AST_Assign) return parent.operator == "=" && parent.left === node;
|
||||
if (parent instanceof AST_DefaultValue) return parent.name === node;
|
||||
if (parent instanceof AST_DestructuredArray) return true;
|
||||
if (parent instanceof AST_DestructuredKeyVal) return parent.value === node;
|
||||
}
|
||||
|
||||
function should_stop(node, parent) {
|
||||
if (node === rvalue) return true;
|
||||
if (parent instanceof AST_For) return node !== parent.init;
|
||||
@@ -1773,7 +1801,7 @@ merge(Compressor.prototype, {
|
||||
}
|
||||
if (node instanceof AST_Debugger) return true;
|
||||
if (node instanceof AST_Defun) return funarg && lhs.name === node.name.name;
|
||||
if (node instanceof AST_Destructured) return parent instanceof AST_Assign;
|
||||
if (node instanceof AST_Destructured) return (in_try || !lhs_local) && parent instanceof AST_Assign;
|
||||
if (node instanceof AST_DestructuredKeyVal) return node.key instanceof AST_Node;
|
||||
if (node instanceof AST_DWLoop) return true;
|
||||
if (node instanceof AST_LoopControl) return true;
|
||||
@@ -1784,7 +1812,7 @@ merge(Compressor.prototype, {
|
||||
return !(parent instanceof AST_PropAccess && parent.expression === node)
|
||||
&& is_arguments(node.definition());
|
||||
}
|
||||
} else if (parent instanceof AST_Assign && parent.operator == "=" && parent.left === node) {
|
||||
} else if (is_direct_assignment(node, parent)) {
|
||||
return false;
|
||||
}
|
||||
if (!replace_all) return true;
|
||||
@@ -1864,9 +1892,7 @@ merge(Compressor.prototype, {
|
||||
}
|
||||
if (node instanceof AST_Spread) return true;
|
||||
if (node instanceof AST_SymbolRef) {
|
||||
if (symbol_in_lvalues(node, parent)) {
|
||||
return !(parent instanceof AST_Assign && parent.operator == "=" && parent.left === node);
|
||||
}
|
||||
if (symbol_in_lvalues(node, parent)) return !is_direct_assignment(node, parent);
|
||||
if (side_effects && may_modify(node)) return true;
|
||||
var def = node.definition();
|
||||
return (in_try || def.scope.resolve() !== scope) && !can_drop_symbol(node);
|
||||
|
||||
Reference in New Issue
Block a user