Evaluate "foo".length ==> 3
authorDan Wolff <dan.d.wolff@gmail.com>
Mon, 30 Jun 2014 22:51:42 +0000 (00:51 +0200)
committerMihai Bazon <mihai@bazon.net>
Tue, 1 Jul 2014 08:06:51 +0000 (11:06 +0300)
lib/compress.js
test/compress/properties.js

index b589aca..fd3f7a2 100644 (file)
@@ -775,6 +775,14 @@ merge(Compressor.prototype, {
             if (d && d.constant && d.init) return ev(d.init, compressor);
             throw def;
         });
+        def(AST_Dot, function(compressor){
+            if (compressor.option("unsafe") && this.property == "length") {
+                var str = ev(this.expression, compressor);
+                if (typeof str == "string")
+                    return str.length;
+            }
+            throw def;
+        });
     })(function(node, func){
         node.DEFMETHOD("_eval", func);
     });
@@ -2349,7 +2357,7 @@ merge(Compressor.prototype, {
                 return make_node(AST_Dot, self, {
                     expression : self.expression,
                     property   : prop
-                });
+                }).optimize(compressor);
             }
             var v = parseFloat(prop);
             if (!isNaN(v) && v.toString() == prop) {
@@ -2361,6 +2369,10 @@ merge(Compressor.prototype, {
         return self;
     });
 
+    OPT(AST_Dot, function(self, compressor){
+        return self.evaluate(compressor)[0];
+    });
+
     function literals_in_boolean_context(self, compressor) {
         if (compressor.option("booleans") && compressor.in_boolean_context()) {
             return make_node(AST_True, self);
index 736d9d8..3947073 100644 (file)
@@ -52,3 +52,23 @@ dot_properties_es5: {
         a[""] = "whitespace";
     }
 }
+
+evaluate_length: {
+    options = {
+        properties: true,
+        unsafe: true,
+        evaluate: true
+    };
+    input: {
+        a = "foo".length;
+        a = ("foo" + "bar")["len" + "gth"];
+        a = b.length;
+        a = ("foo" + b).length;
+    }
+    expect: {
+        a = 3;
+        a = 6;
+        a = b.length;
+        a = ("foo" + b).length;
+    }
+}