remove hack in `collapse_vars` (#2457)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 9 Nov 2017 12:00:58 +0000 (20:00 +0800)
committerGitHub <noreply@github.com>
Thu, 9 Nov 2017 12:00:58 +0000 (20:00 +0800)
fixes #2456

lib/compress.js
test/mocha/minify.js

index 6354197..e457d80 100644 (file)
@@ -1062,7 +1062,7 @@ merge(Compressor.prototype, {
                 var found = false;
                 return statements[stat_index].transform(new TreeTransformer(function(node, descend, in_list) {
                     if (found) return node;
-                    if (node === expr) {
+                    if (node === expr || node.body === expr) {
                         found = true;
                         if (node instanceof AST_VarDef) {
                             drop_decl(node.name.definition());
@@ -1076,7 +1076,6 @@ merge(Compressor.prototype, {
                       case 0: return null;
                       case 1: return node.expressions[0];
                     }
-                    if (node instanceof AST_SimpleStatement && !node.body) return null;
                 }));
             }
 
index aed8f91..516541c 100644 (file)
@@ -297,4 +297,36 @@ describe("minify", function() {
             assert.strictEqual(result.code, "alert({bar:42});");
         });
     });
+
+    describe("collapse_vars", function() {
+        it("Should not produce invalid AST", function() {
+            var code = [
+                "function f(a) {",
+                "    a = x();",
+                "    return a;",
+                "}",
+                "f();",
+            ].join("\n");
+            var ast = Uglify.minify(code, {
+                compress: false,
+                mangle: false,
+                output: {
+                    ast: true
+                },
+            }).ast;
+            assert.strictEqual(ast.TYPE, "Toplevel");
+            assert.strictEqual(ast.body.length, 2);
+            assert.strictEqual(ast.body[0].TYPE, "Defun");
+            assert.strictEqual(ast.body[0].body.length, 2);
+            assert.strictEqual(ast.body[0].body[0].TYPE, "SimpleStatement");
+            var stat = ast.body[0].body[0];
+            Uglify.minify(ast, {
+                compress: {
+                    sequences: false
+                }
+            });
+            assert.ok(stat.body);
+            assert.strictEqual(stat.print_to_string(), "a=x()");
+        });
+    });
 });