aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/compress.js33
-rw-r--r--test/compress/destructured.js31
-rw-r--r--test/compress/functions.js5
3 files changed, 59 insertions, 10 deletions
diff --git a/lib/compress.js b/lib/compress.js
index 601f39f0..1161f3b6 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -752,14 +752,18 @@ merge(Compressor.prototype, {
def(AST_Call, function(tw, descend) {
tw.find_parent(AST_Scope).may_call_this();
var exp = this.expression;
- if (exp instanceof AST_Function) {
+ var tail = exp.tail_node();
+ if (tail instanceof AST_Function) {
+ if (exp !== tail) exp.expressions.slice(0, -1).forEach(function(node) {
+ node.walk(tw);
+ });
this.args.forEach(function(arg) {
arg.walk(tw);
});
- exp.walk(tw);
+ tail.walk(tw);
return true;
- } else if (exp instanceof AST_SymbolRef) {
- var def = exp.definition();
+ } else if (tail instanceof AST_SymbolRef) {
+ var def = tail.definition();
if (this.TYPE == "Call" && tw.in_boolean_context()) def.bool_fn++;
if (!(def.fixed instanceof AST_Defun)) return;
var defun = mark_defun(tw, def);
@@ -768,11 +772,11 @@ merge(Compressor.prototype, {
defun.walk(tw);
return true;
} else if (this.TYPE == "Call"
- && exp instanceof AST_Assign
- && exp.operator == "="
- && exp.left instanceof AST_SymbolRef
+ && tail instanceof AST_Assign
+ && tail.operator == "="
+ && tail.left instanceof AST_SymbolRef
&& tw.in_boolean_context()) {
- exp.left.definition().bool_fn++;
+ tail.left.definition().bool_fn++;
}
});
def(AST_Conditional, function(tw) {
@@ -4681,6 +4685,19 @@ merge(Compressor.prototype, {
if (!(target instanceof AST_IterationStatement)) insert(target);
return true;
}
+ if (node instanceof AST_Call) {
+ var exp = node.expression;
+ var tail = exp.tail_node();
+ if (!(tail instanceof AST_Function)) return;
+ if (exp !== tail) exp.expressions.slice(0, -1).forEach(function(node) {
+ node.walk(tw);
+ });
+ node.args.forEach(function(arg) {
+ arg.walk(tw);
+ });
+ tail.walk(tw);
+ return true;
+ }
if (node instanceof AST_Conditional) {
node.condition.walk(tw);
push();
diff --git a/test/compress/destructured.js b/test/compress/destructured.js
index f8e8090d..e654847a 100644
--- a/test/compress/destructured.js
+++ b/test/compress/destructured.js
@@ -1616,3 +1616,34 @@ issue_4308: {
expect_stdout: "PASS"
node_version: ">=6"
}
+
+issue_4312: {
+ options = {
+ collapse_vars: true,
+ inline: true,
+ merge_vars: true,
+ reduce_vars: true,
+ toplevel: true,
+ unused: true,
+ }
+ input: {
+ var a;
+ (function f(b, c) {
+ return function({
+ [a = b]: d,
+ }) {}(c && c);
+ })("PASS", "FAIL");
+ console.log(a);
+ }
+ expect: {
+ var a;
+ b = "PASS",
+ (function({
+ [a = b]: d,
+ }){})((c = "FAIL") && c);
+ var b, c;
+ console.log(a);
+ }
+ expect_stdout: "PASS"
+ node_version: ">=6"
+}
diff --git a/test/compress/functions.js b/test/compress/functions.js
index 686e7a50..e06596b8 100644
--- a/test/compress/functions.js
+++ b/test/compress/functions.js
@@ -521,7 +521,7 @@ issue_2531_2: {
options = {
evaluate: true,
inline: true,
- passes: 3,
+ passes: 2,
reduce_funcs: true,
reduce_vars: true,
side_effects: true,
@@ -556,9 +556,10 @@ issue_2531_3: {
options = {
evaluate: true,
inline: true,
- passes: 3,
+ passes: 2,
reduce_funcs: true,
reduce_vars: true,
+ sequences: true,
side_effects: true,
toplevel: true,
unused: true,