enhance `functions` (#3368)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 19 Apr 2019 11:01:47 +0000 (19:01 +0800)
committerGitHub <noreply@github.com>
Fri, 19 Apr 2019 11:01:47 +0000 (19:01 +0800)
lib/compress.js
test/compress/functions.js

index f72972b..9fdfc43 100644 (file)
@@ -3596,13 +3596,17 @@ merge(Compressor.prototype, {
                         } else if (compressor.option("functions")
                             && def.value === def.name.fixed_value()
                             && def.value instanceof AST_Function
-                            && !def.value.name
-                            && !def.value.variables.get(def.name.name)
+                            && can_rename(def.value, def.name.name)
                             && (!compressor.has_directive("use strict") || parent instanceof AST_Scope)) {
                             compressor.warn("Declaring {name} as function [{file}:{line},{col}]", template(def.name));
                             var defun = make_node(AST_Defun, def, def.value);
                             defun.name = make_node(AST_SymbolDefun, def.name, def.name);
-                            def.name.scope.resolve().def_function(defun.name);
+                            var name_def = def.name.scope.resolve().def_function(defun.name);
+                            if (def.value.name) def.value.name.definition().references.forEach(function(ref) {
+                                ref.name = name_def.name;
+                                ref.thedef = name_def;
+                                ref.reference({});
+                            });
                             body.push(defun);
                         } else {
                             if (side_effects.length > 0) {
@@ -3633,6 +3637,11 @@ merge(Compressor.prototype, {
                         }
                         sym.eliminated++;
                     }
+
+                    function can_rename(fn, name) {
+                        var def = fn.variables.get(name);
+                        return !def || fn.name && def === fn.name.definition();
+                    }
                 });
                 if (head.length > 0 || tail.length > 0) {
                     node.definitions = head.concat(tail);
index 7303b91..64f3bbc 100644 (file)
@@ -2712,8 +2712,8 @@ functions: {
     }
     input: {
         !function() {
-            var a = function() {
-                return "a";
+            var a = function a() {
+                return a && "a";
             };
             var b = function x() {
                 return !!x;
@@ -2736,19 +2736,19 @@ functions: {
     expect: {
         !function() {
             function a() {
-                return "a";
+                return a && "a";
+            }
+            function b() {
+                return !!b;
             }
-            var b = function x() {
-                return !!x;
-            };
             var c = function(c) {
                 return c;
             };
             if (c(b(a()))) {
                 function d() {}
-                var e = function y() {
-                    return typeof y;
-                };
+                function e() {
+                    return typeof e;
+                }
                 var f = function(f) {
                     return f;
                 };
@@ -2768,8 +2768,8 @@ functions_use_strict: {
     input: {
         "use strict";
         !function() {
-            var a = function() {
-                return "a";
+            var a = function a() {
+                return a && "a";
             };
             var b = function x() {
                 return !!x;
@@ -2793,11 +2793,11 @@ functions_use_strict: {
         "use strict";
         !function() {
             function a() {
-                return "a";
+                return a && "a";
+            }
+            function b() {
+                return !!b;
             }
-            var b = function x() {
-                return !!x;
-            };
             var c = function(c) {
                 return c;
             };