enhance `conditionals` (#2758)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 10 Jan 2018 08:59:57 +0000 (16:59 +0800)
committerGitHub <noreply@github.com>
Wed, 10 Jan 2018 08:59:57 +0000 (16:59 +0800)
`x ? y || z : z` --> `x && y || z`

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

index 406a331..9760c54 100644 (file)
@@ -5278,6 +5278,20 @@ merge(Compressor.prototype, {
                 consequent
             ]).optimize(compressor);
         }
+        // x ? y || z : z --> x && y || z
+        if (consequent instanceof AST_Binary
+            && consequent.operator == "||"
+            && consequent.right.equivalent_to(alternative)) {
+            return make_node(AST_Binary, self, {
+                operator: "||",
+                left: make_node(AST_Binary, self, {
+                    operator: "&&",
+                    left: self.condition,
+                    right: consequent.left
+                }),
+                right: alternative
+            }).optimize(compressor);
+        }
         var in_bool = compressor.in_boolean_context();
         if (is_true(self.consequent)) {
             if (is_false(self.alternative)) {
index 7838fdb..e37c555 100644 (file)
@@ -1224,3 +1224,46 @@ hoist_decl: {
         x() ? y() : z();
     }
 }
+
+to_and_or: {
+    options = {
+        conditionals: true,
+    }
+    input: {
+        var values = [
+            0,
+            null,
+            true,
+            "foo",
+            false,
+            -1 / 0,
+            void 0,
+        ];
+        values.forEach(function(x) {
+            values.forEach(function(y) {
+                values.forEach(function(z) {
+                    console.log(x ? y || z : z);
+                });
+            });
+        });
+    }
+    expect: {
+        var values = [
+            0,
+            null,
+            true,
+            "foo",
+            false,
+            -1 / 0,
+            void 0,
+        ];
+        values.forEach(function(x) {
+            values.forEach(function(y) {
+                values.forEach(function(z) {
+                    console.log(x && y || z);
+                });
+            });
+        });
+    }
+    expect_stdout: true
+}