diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2019-04-19 19:01:47 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-19 19:01:47 +0800 |
commit | 00833e893a3d21745fc6a66d9d43e0e988b0d72b (patch) | |
tree | 4b721156ddbfc3fae389dd1e1c39e5401db7a7eb | |
parent | f1a77e4fc03a3ff9e217992e5aa1a62fc35e0f2f (diff) | |
download | tracifyjs-00833e893a3d21745fc6a66d9d43e0e988b0d72b.tar.gz tracifyjs-00833e893a3d21745fc6a66d9d43e0e988b0d72b.zip |
enhance `functions` (#3368)
-rw-r--r-- | lib/compress.js | 15 | ||||
-rw-r--r-- | test/compress/functions.js | 30 |
2 files changed, 27 insertions, 18 deletions
diff --git a/lib/compress.js b/lib/compress.js index f72972b1..9fdfc43a 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -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); diff --git a/test/compress/functions.js b/test/compress/functions.js index 7303b91b..64f3bbcc 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -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; }; |