fix corner case in `conditionals` (#3244)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 30 Aug 2018 07:59:05 +0000 (15:59 +0800)
committerGitHub <noreply@github.com>
Thu, 30 Aug 2018 07:59:05 +0000 (15:59 +0800)
lib/compress.js
test/compress/conditionals.js

index 53ed4af..df33a5c 100644 (file)
@@ -6048,23 +6048,25 @@ merge(Compressor.prototype, {
         //                   v
         // exp = foo ? something : something_else;
         var seq_tail = consequent.tail_node();
-        var alt_tail = alternative.tail_node();
-        if (seq_tail instanceof AST_Assign
-            && alt_tail instanceof AST_Assign
-            && seq_tail.operator == alt_tail.operator
-            && seq_tail.left.equivalent_to(alt_tail.left)
-            && (!condition.has_side_effects(compressor)
-                || seq_tail.operator == "="
-                    && !seq_tail.left.has_side_effects(compressor))) {
-            return make_node(AST_Assign, self, {
-                operator: seq_tail.operator,
-                left: seq_tail.left,
-                right: make_node(AST_Conditional, self, {
-                    condition: condition,
-                    consequent: pop_lhs(consequent),
-                    alternative: pop_lhs(alternative)
-                })
-            });
+        if (seq_tail instanceof AST_Assign) {
+            var is_eq = seq_tail.operator == "=";
+            var alt_tail = is_eq ? alternative.tail_node() : alternative;
+            if ((is_eq || consequent instanceof AST_Assign)
+                && alt_tail instanceof AST_Assign
+                && seq_tail.operator == alt_tail.operator
+                && seq_tail.left.equivalent_to(alt_tail.left)
+                && (!condition.has_side_effects(compressor)
+                    || is_eq && !seq_tail.left.has_side_effects(compressor))) {
+                return make_node(AST_Assign, self, {
+                    operator: seq_tail.operator,
+                    left: seq_tail.left,
+                    right: make_node(AST_Conditional, self, {
+                        condition: condition,
+                        consequent: pop_lhs(consequent),
+                        alternative: pop_lhs(alternative)
+                    })
+                });
+            }
         }
         // x ? y(a) : y(b) --> y(x ? a : b)
         var arg_index;
index 35505c8..1c1291f 100644 (file)
@@ -1364,3 +1364,23 @@ cond_seq_assign_2: {
         "42",
     ]
 }
+
+cond_seq_assign_3: {
+    options = {
+        conditionals: true,
+    }
+    input: {
+        var c = 0;
+        if (this)
+            c = 1 + c, c = c + 1;
+        else
+            c = 1 + c, c = c + 1;
+        console.log(c);
+    }
+    expect: {
+        var c = 0;
+        this, c = 1 + c, c += 1;
+        console.log(c);
+    }
+    expect_stdout: "2"
+}