Drop last `default:` if it's the last branch and empty
authorMihai Bazon <mihai@bazon.net>
Fri, 1 Mar 2013 11:12:03 +0000 (13:12 +0200)
committerMihai Bazon <mihai@bazon.net>
Fri, 1 Mar 2013 11:12:03 +0000 (13:12 +0200)
Close #141

lib/compress.js
test/compress/switch.js

index f404899..efdb49f 100644 (file)
@@ -1414,11 +1414,18 @@ merge(Compressor.prototype, {
                 body: self.expression
             }).transform(compressor);
         }
-        var last_branch = self.body[self.body.length - 1];
-        if (last_branch) {
-            var stat = last_branch.body[last_branch.body.length - 1]; // last statement
-            if (stat instanceof AST_Break && loop_body(compressor.loopcontrol_target(stat.label)) === self)
-                last_branch.body.pop();
+        for(;;) {
+            var last_branch = self.body[self.body.length - 1];
+            if (last_branch) {
+                var stat = last_branch.body[last_branch.body.length - 1]; // last statement
+                if (stat instanceof AST_Break && loop_body(compressor.loopcontrol_target(stat.label)) === self)
+                    last_branch.body.pop();
+                if (last_branch instanceof AST_Default && last_branch.body.length == 0) {
+                    self.body.pop();
+                    continue;
+                }
+            }
+            break;
         }
         var exp = self.expression.evaluate(compressor);
         out: if (exp.length == 2) try {
index 6fde5dd..62e39cf 100644 (file)
@@ -208,3 +208,53 @@ constant_switch_9: {
         }
     }
 }
+
+drop_default_1: {
+    options = { dead_code: true };
+    input: {
+        switch (foo) {
+          case 'bar': baz();
+          default:
+        }
+    }
+    expect: {
+        switch (foo) {
+          case 'bar': baz();
+        }
+    }
+}
+
+drop_default_2: {
+    options = { dead_code: true };
+    input: {
+        switch (foo) {
+          case 'bar': baz(); break;
+          default:
+            break;
+        }
+    }
+    expect: {
+        switch (foo) {
+          case 'bar': baz();
+        }
+    }
+}
+
+keep_default: {
+    options = { dead_code: true };
+    input: {
+        switch (foo) {
+          case 'bar': baz();
+          default:
+            something();
+            break;
+        }
+    }
+    expect: {
+        switch (foo) {
+          case 'bar': baz();
+          default:
+            something();
+        }
+    }
+}