drop anonymous function name when overshadowed by other declarations (#1712)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 28 Mar 2017 09:02:20 +0000 (17:02 +0800)
committerGitHub <noreply@github.com>
Tue, 28 Mar 2017 09:02:20 +0000 (17:02 +0800)
fixes #1709

lib/compress.js
test/compress/drop-unused.js

index e2fde88..e4863d9 100644 (file)
@@ -1850,9 +1850,13 @@ merge(Compressor.prototype, {
                 function before(node, descend, in_list) {
                     if (node instanceof AST_Function
                         && node.name
-                        && !compressor.option("keep_fnames")
-                        && !(node.name.definition().id in in_use_ids)) {
-                        node.name = null;
+                        && !compressor.option("keep_fnames")) {
+                        var def = node.name.definition();
+                        // any declarations with same name will overshadow
+                        // name of this anonymous function and can therefore
+                        // never be used anywhere
+                        if (!(def.id in in_use_ids) || def.orig.length > 1)
+                            node.name = null;
                     }
                     if (node instanceof AST_Lambda && !(node instanceof AST_Accessor)) {
                         var trim = !compressor.option("keep_fargs");
index fabf8d9..10ca549 100644 (file)
@@ -805,3 +805,42 @@ issue_1656: {
     }
     expect_exact: "for (;;) ;"
 }
+
+issue_1709: {
+    options = {
+        unused: true,
+    }
+    input: {
+        console.log(
+            function x() {
+                var x = 1;
+                return x;
+            }(),
+            function y() {
+                const y = 2;
+                return y;
+            }(),
+            function z() {
+                function z() {}
+                return z;
+            }()
+        );
+    }
+    expect: {
+        console.log(
+            function() {
+                var x = 1;
+                return x;
+            }(),
+            function() {
+                const y = 2;
+                return y;
+            }(),
+            function() {
+                function z() {}
+                return z;
+            }()
+        );
+    }
+    expect_stdout: true
+}