suppress `collapse_vars` of `this` as call argument (#2204)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 5 Jul 2017 17:03:52 +0000 (01:03 +0800)
committerGitHub <noreply@github.com>
Wed, 5 Jul 2017 17:03:52 +0000 (01:03 +0800)
fixes #2203

lib/compress.js
test/compress/collapse_vars.js

index d9936d2..a2acd53 100644 (file)
@@ -823,16 +823,23 @@ merge(Compressor.prototype, {
                     fn.argnames.forEach(function(sym, i) {
                         var arg = iife.args[i];
                         if (!arg) arg = make_node(AST_Undefined, sym);
-                        else arg.walk(new TreeWalker(function(node) {
-                            if (!arg) return true;
-                            if (node instanceof AST_SymbolRef && fn.variables.has(node.name)) {
-                                var s = node.definition().scope;
-                                if (s !== scope) while (s = s.parent_scope) {
-                                    if (s === scope) return true;
+                        else {
+                            var tw = new TreeWalker(function(node) {
+                                if (!arg) return true;
+                                if (node instanceof AST_SymbolRef && fn.variables.has(node.name)) {
+                                    var s = node.definition().scope;
+                                    if (s !== scope) while (s = s.parent_scope) {
+                                        if (s === scope) return true;
+                                    }
+                                    arg = null;
                                 }
-                                arg = null;
-                            }
-                        }));
+                                if (node instanceof AST_This && !tw.find_parent(AST_Scope)) {
+                                    arg = null;
+                                    return true;
+                                }
+                            });
+                            arg.walk(tw);
+                        }
                         if (arg) candidates.push(make_node(AST_VarDef, sym, {
                             name: sym,
                             value: arg
index 24f8ffa..7f3c470 100644 (file)
@@ -2256,3 +2256,67 @@ issue_2187_3: {
     }
     expect_stdout: "1"
 }
+
+issue_2203_1: {
+    options = {
+        collapse_vars: true,
+        unused: true,
+    }
+    input: {
+        a = "FAIL";
+        console.log({
+            a: "PASS",
+            b: function() {
+                return function(c) {
+                    return c.a;
+                }((String, (Object, this)));
+            }
+        }.b());
+    }
+    expect: {
+        a = "FAIL";
+        console.log({
+            a: "PASS",
+            b: function() {
+                return function(c) {
+                    return c.a;
+                }((String, (Object, this)));
+            }
+        }.b());
+    }
+    expect_stdout: "PASS"
+}
+
+issue_2203_2: {
+    options = {
+        collapse_vars: true,
+        unused: true,
+    }
+    input: {
+        a = "PASS";
+        console.log({
+            a: "FAIL",
+            b: function() {
+                return function(c) {
+                    return c.a;
+                }((String, (Object, function() {
+                    return this;
+                }())));
+            }
+        }.b());
+    }
+    expect: {
+        a = "PASS";
+        console.log({
+            a: "FAIL",
+            b: function() {
+                return function(c) {
+                    return (String, (Object, function() {
+                        return this;
+                    }())).a;
+                }();
+            }
+        }.b());
+    }
+    expect_stdout: "PASS"
+}