When `unsafe` is set, evaluate [...].join() if possible
authorMihai Bazon <mihai.bazon@gmail.com>
Thu, 19 Sep 2013 15:20:45 +0000 (18:20 +0300)
committerMihai Bazon <mihai.bazon@gmail.com>
Thu, 19 Sep 2013 15:20:45 +0000 (18:20 +0300)
Close #298

lib/compress.js
test/compress/arrays.js

index 8bd58bb..35646cf 100644 (file)
@@ -746,6 +746,19 @@ merge(Compressor.prototype, {
             if (d && d.constant && d.init) return ev(d.init, compressor);
             throw def;
         });
+        def(AST_Call, function(compressor){
+            if (compressor.option("unsafe")) {
+                if (this.expression instanceof AST_Dot
+                    && this.expression.expression instanceof AST_Array
+                    && this.expression.property == "join") {
+                    var x =  this.expression.expression.elements.map(function(el){
+                        return ev(el, compressor);
+                    });
+                    return x.join(ev(this.args[0]));
+                }
+            }
+            throw def;
+        });
     })(function(node, func){
         node.DEFMETHOD("_eval", func);
     });
@@ -1704,7 +1717,7 @@ merge(Compressor.prototype, {
                 return make_node(AST_Undefined, self).transform(compressor);
             }
         }
-        return self;
+        return self.evaluate(compressor)[0];
     });
 
     OPT(AST_New, function(self, compressor){
index 0c3d8ba..214928d 100644 (file)
@@ -12,3 +12,22 @@ holes_and_undefined: {
         z=[1,void 0,3];
     }
 }
+
+constant_join: {
+    options = {
+        unsafe   : true,
+        evaluate : true
+    };
+    input: {
+        var a = [ "foo", "bar", "baz" ].join("");
+        var b = [ "foo", 1, 2, 3, "bar" ].join("");
+        var c = [ boo(), "foo", 1, 2, 3, "bar", bar() ].join("");
+        var d = [ "foo", 1 + 2 + "bar", "baz" ].join("-");
+    }
+    expect: {
+        var a = "foobarbaz";
+        var b = "foo123bar";
+        var c = [ boo(), "foo", 1, 2, 3, "bar", bar() ].join(""); // we could still shorten this one, but oh well.
+        var d = "foo-3bar-baz";
+    }
+}