Simplify nested conditionals if possible
authorMatt Basta <me@mattbasta.com>
Thu, 6 Feb 2014 20:39:13 +0000 (12:39 -0800)
committerMatt Basta <me@mattbasta.com>
Thu, 6 Feb 2014 20:39:13 +0000 (12:39 -0800)
lib/compress.js
test/compress/conditionals.js

index 1b6bedd..005c606 100644 (file)
@@ -2296,6 +2296,19 @@ merge(Compressor.prototype, {
                 return consequent;
             }
         }
+        // x?y?z:a:a --> x&&y?z:a
+        if (consequent instanceof AST_Conditional
+            && consequent.alternative.equivalent_to(alternative)) {
+            return make_node(AST_Conditional, self, {
+                condition: make_node(AST_Binary, self, {
+                    left: self.condition,
+                    operator: "&&",
+                    right: consequent.condition
+                }),
+                consequent: consequent.consequent,
+                alternative: alternative
+            });
+        }
         return self;
     });
 
index 9ef30ac..213b246 100644 (file)
@@ -205,3 +205,30 @@ cond_4: {
         some_condition(), do_something();
     }
 }
+
+cond_5: {
+    options = {
+        conditionals: true
+    };
+    input: {
+        if (some_condition()) {
+            if (some_other_condition()) {
+                do_something();
+            } else {
+                alternate();
+            }
+        } else {
+            alternate();
+        }
+
+        if (some_condition()) {
+            if (some_other_condition()) {
+                do_something();
+            }
+        }
+    }
+    expect: {
+        some_condition() && some_other_condition() ? do_something() : alternate();
+        some_condition() && some_other_condition() && do_something();
+    }
+}