aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2019-04-19 19:01:47 +0800
committerGitHub <noreply@github.com>2019-04-19 19:01:47 +0800
commit00833e893a3d21745fc6a66d9d43e0e988b0d72b (patch)
tree4b721156ddbfc3fae389dd1e1c39e5401db7a7eb
parentf1a77e4fc03a3ff9e217992e5aa1a62fc35e0f2f (diff)
downloadtracifyjs-00833e893a3d21745fc6a66d9d43e0e988b0d72b.tar.gz
tracifyjs-00833e893a3d21745fc6a66d9d43e0e988b0d72b.zip
enhance `functions` (#3368)
-rw-r--r--lib/compress.js15
-rw-r--r--test/compress/functions.js30
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;
};