fix corner case in functions (#4619)

fixes #4618
This commit is contained in:
Alex Lam S.L
2021-02-07 05:52:09 +00:00
committed by GitHub
parent 5c84dfa151
commit 522cceeccf
2 changed files with 50 additions and 15 deletions

View File

@@ -5854,13 +5854,7 @@ merge(Compressor.prototype, {
&& var_defs[sym.id] == 1 && var_defs[sym.id] == 1
&& sym.assignments == 0 && sym.assignments == 0
&& (value instanceof AST_AsyncFunction || value instanceof AST_Function) && (value instanceof AST_AsyncFunction || value instanceof AST_Function)
&& (sym.references.length ? all(sym.references, function(ref) { && assigned_once(value, sym.references)
return value === ref.fixed_value();
}) : value === def.name.fixed_value())
&& (!value.name || (old_def = value.name.definition()).assignments == 0
&& (old_def.name == def.name.name || all(old_def.references, function(ref) {
return ref.scope.find_variable(def.name.name) === def.name.definition();
})))
&& can_declare_defun() && can_declare_defun()
&& can_rename(value, def.name.name)) { && can_rename(value, def.name.name)) {
AST_Node.warn("Declaring {name} as function [{file}:{line},{col}]", template(def.name)); AST_Node.warn("Declaring {name} as function [{file}:{line},{col}]", template(def.name));
@@ -5902,14 +5896,11 @@ merge(Compressor.prototype, {
sym.eliminated++; sym.eliminated++;
} }
function is_catch(node) { function assigned_once(fn, refs) {
var sym = node.definition(); if (refs.length == 0) return fn === def.name.fixed_value();
return sym.orig[0] instanceof AST_SymbolCatch && sym.scope.resolve() === node.scope.resolve(); return all(refs, function(ref) {
} return fn === ref.fixed_value();
});
function can_rename(fn, name) {
var def = fn.variables.get(name);
return !def || fn.name && def === fn.name.definition();
} }
function can_declare_defun() { function can_declare_defun() {
@@ -5919,6 +5910,22 @@ merge(Compressor.prototype, {
|| parent instanceof AST_If; || parent instanceof AST_If;
} }
function can_rename(fn, name) {
if (!fn.name) return !fn.variables.get(name);
old_def = fn.name.definition();
if (old_def.assignments > 0) return false;
if (old_def.name == name) return true;
if (name == "await" && is_async(fn)) return false;
return all(old_def.references, function(ref) {
return ref.scope.find_variable(name) === sym;
});
}
function is_catch(node) {
var sym = node.definition();
return sym.orig[0] instanceof AST_SymbolCatch && sym.scope.resolve() === node.scope.resolve();
}
function flush() { function flush() {
if (side_effects.length > 0) { if (side_effects.length > 0) {
if (tail.length == 0) { if (tail.length == 0) {

View File

@@ -1218,3 +1218,31 @@ issue_4598: {
expect_stdout: "PASS" expect_stdout: "PASS"
node_version: ">=8" node_version: ">=8"
} }
issue_4618: {
options = {
functions: true,
reduce_vars: true,
unused: true,
}
input: {
console.log(typeof function() {
var await = async function f() {
console || f();
};
console.log;
return await;
}());
}
expect: {
console.log(typeof function() {
var await = async function f() {
console || f();
};
console.log;
return await;
}());
}
expect_stdout: "function"
node_version: ">=8"
}