enhance `conditionals` (#2966)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 28 Feb 2018 15:34:48 +0000 (23:34 +0800)
committerGitHub <noreply@github.com>
Wed, 28 Feb 2018 15:34:48 +0000 (23:34 +0800)
- `x ? (y, w) : (z, w)` => `x ? y : z, w`

lib/compress.js
test/compress/conditionals.js
test/compress/transform.js

index e83524c..504d270 100644 (file)
@@ -5727,6 +5727,18 @@ merge(Compressor.prototype, {
                 consequent
             ]).optimize(compressor);
         }
+        // x ? (y, w) : (z, w) --> x ? y : z, w
+        if ((consequent instanceof AST_Sequence || alternative instanceof AST_Sequence)
+            && consequent.tail_node().equivalent_to(alternative.tail_node())) {
+            return make_sequence(self, [
+                make_node(AST_Conditional, self, {
+                    condition: self.condition,
+                    consequent: pop_seq(consequent),
+                    alternative: pop_seq(alternative)
+                }),
+                consequent.tail_node()
+            ]).optimize(compressor);
+        }
         // x ? y || z : z --> x && y || z
         if (consequent instanceof AST_Binary
             && consequent.operator == "||"
@@ -5829,6 +5841,13 @@ merge(Compressor.prototype, {
                 }
             }
         }
+
+        function pop_seq(node) {
+            if (!(node instanceof AST_Sequence)) return make_node(AST_Number, node, {
+                value: 0
+            });
+            return make_sequence(node, node.expressions.slice(0, -1));
+        }
     });
 
     OPT(AST_Boolean, function(self, compressor){
index e37c555..abb3969 100644 (file)
@@ -332,7 +332,7 @@ cond_7: {
         x = 'foo';
         x = 'foo';
         x = (condition(), 20);
-        x = z ? 'fuji' : (condition(), 'fuji');
+        x = (z || condition(), 'fuji');
         x = (condition(), 'foobar');
         x = y ? a : b;
         x = y ? 'foo' : 'fo';
index 68d3384..58874cd 100644 (file)
@@ -104,6 +104,7 @@ if_return: {
         conditionals: true,
         if_return: true,
         sequences: true,
+        side_effects: true,
     }
     input: {
         function f(w, x, y, z) {
@@ -124,7 +125,7 @@ if_return: {
                 if (w) {
                     if (y) return;
                 } else if (z) return;
-                return x == y || (x && w(), y && z(), !0);
+                return x == y || (x && w(), y && z()), !0;
             }
         }
     }