enhance `conditionals` (#3557)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 31 Oct 2019 01:33:46 +0000 (09:33 +0800)
committerGitHub <noreply@github.com>
Thu, 31 Oct 2019 01:33:46 +0000 (09:33 +0800)
lib/compress.js
test/compress/conditionals.js

index 9e2b689..a6f5d20 100644 (file)
@@ -4665,11 +4665,6 @@ merge(Compressor.prototype, {
             self.body = self.alternative || make_node(AST_EmptyStatement, self);
             self.alternative = tmp;
         }
-        if (is_empty(self.body) && is_empty(self.alternative)) {
-            return make_node(AST_SimpleStatement, self.condition, {
-                body: self.condition.clone()
-            }).optimize(compressor);
-        }
         if (self.body instanceof AST_SimpleStatement
             && self.alternative instanceof AST_SimpleStatement) {
             return make_node(AST_SimpleStatement, self, {
@@ -4703,15 +4698,22 @@ merge(Compressor.prototype, {
                 }).transform(compressor)
             }).optimize(compressor);
         }
-        if (self.body instanceof AST_EmptyStatement
-            && self.alternative instanceof AST_SimpleStatement) {
-            return make_node(AST_SimpleStatement, self, {
+        if (is_empty(self.body)) {
+            if (is_empty(self.alternative)) return make_node(AST_SimpleStatement, self.condition, {
+                body: self.condition.clone()
+            }).optimize(compressor);
+            if (self.alternative instanceof AST_SimpleStatement) return make_node(AST_SimpleStatement, self, {
                 body: make_node(AST_Binary, self, {
                     operator : "||",
                     left     : self.condition,
                     right    : self.alternative.body
                 }).transform(compressor)
             }).optimize(compressor);
+            self = make_node(AST_If, self, {
+                condition: negated,
+                body: self.alternative,
+                alternative: null
+            });
         }
         if (self.body instanceof AST_Exit
             && self.alternative instanceof AST_Exit
index 594d956..27536b9 100644 (file)
@@ -161,6 +161,24 @@ ifs_6: {
     }
 }
 
+ifs_7: {
+    options = {
+        conditionals: true,
+    }
+    input: {
+        if (A); else;
+        if (A) while (B); else;
+        if (A); else while (C);
+        if (A) while (B); else while (C);
+    }
+    expect: {
+        A;
+        if (A) while (B);
+        if (!A) while (C);
+        if (A) while (B); else while (C);
+    }
+}
+
 cond_1: {
     options = {
         conditionals: true,