Skip to content

Commit

Permalink
enhance functions (#3368)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexlamsl committed Apr 19, 2019
1 parent f1a77e4 commit 00833e8
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 18 deletions.
15 changes: 12 additions & 3 deletions lib/compress.js
Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down
30 changes: 15 additions & 15 deletions test/compress/functions.js
Expand Up @@ -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;
Expand All @@ -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;
};
Expand All @@ -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;
Expand All @@ -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;
};
Expand Down

0 comments on commit 00833e8

Please sign in to comment.