general improvements around `AST_ForIn` (#2796)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 16 Jan 2018 09:03:12 +0000 (17:03 +0800)
committerGitHub <noreply@github.com>
Tue, 16 Jan 2018 09:03:12 +0000 (17:03 +0800)
- compress using `collapse_vars`
- remove unused `name`
- simplify `loop_body`

lib/ast.js
lib/compress.js
lib/parse.js
test/compress/collapse_vars.js

index 6591867..4e41659 100644 (file)
@@ -267,11 +267,10 @@ var AST_For = DEFNODE("For", "init condition step", {
     }
 }, AST_IterationStatement);
 
-var AST_ForIn = DEFNODE("ForIn", "init name object", {
+var AST_ForIn = DEFNODE("ForIn", "init object", {
     $documentation: "A `for ... in` statement",
     $propdoc: {
         init: "[AST_Node] the `for/in` initialization code",
-        name: "[AST_SymbolRef?] the loop variable, only if `init` is AST_Var",
         object: "[AST_Node] the object that we're looping through"
     },
     _walk: function(visitor) {
index fb1c2fd..cd5651a 100644 (file)
@@ -847,9 +847,8 @@ merge(Compressor.prototype, {
     };
 
     function loop_body(x) {
-        if (x instanceof AST_Switch) return x;
-        if (x instanceof AST_For || x instanceof AST_ForIn || x instanceof AST_DWLoop) {
-            return (x.body instanceof AST_BlockStatement ? x.body : x);
+        if (x instanceof AST_IterationStatement) {
+            return x.body instanceof AST_BlockStatement ? x.body : x;
         }
         return x;
     };
@@ -1193,6 +1192,11 @@ merge(Compressor.prototype, {
                     if (!(expr.body instanceof AST_Block)) {
                         extract_candidates(expr.body);
                     }
+                } else if (expr instanceof AST_ForIn) {
+                    extract_candidates(expr.object);
+                    if (!(expr.body instanceof AST_Block)) {
+                        extract_candidates(expr.body);
+                    }
                 } else if (expr instanceof AST_If) {
                     extract_candidates(expr.condition);
                     if (!(expr.body instanceof AST_Block)) {
index 001587b..eba833d 100644 (file)
@@ -1054,12 +1054,10 @@ function parse($TEXT, options) {
     };
 
     function for_in(init) {
-        var lhs = init instanceof AST_Var ? init.definitions[0].name : null;
         var obj = expression(true);
         expect(")");
         return new AST_ForIn({
             init   : init,
-            name   : lhs,
             object : obj,
             body   : in_loop(statement)
         });
index f252a7f..9597b67 100644 (file)
@@ -4062,3 +4062,30 @@ cascade_statement: {
         }
     }
 }
+
+cascade_forin: {
+    options = {
+        collapse_vars: true,
+    }
+    input: {
+        var a;
+        function f(b) {
+            return [ b, b, b ];
+        }
+        for (var c in a = console, f(a))
+            console.log(c);
+    }
+    expect: {
+        var a;
+        function f(b) {
+            return [ b, b, b ];
+        }
+        for (var c in f(a = console))
+            console.log(c);
+    }
+    expect_stdout: [
+        "0",
+        "1",
+        "2",
+    ]
+}