workaround quirks on latter specs (#4172)

closes #4171
This commit is contained in:
Alex Lam S.L
2020-10-03 11:27:17 +01:00
committed by GitHub
parent 8cb509d50e
commit 142bd1bd1a
2 changed files with 77 additions and 2 deletions

View File

@@ -4851,8 +4851,8 @@ merge(Compressor.prototype, {
&& (old_def.name == def.name.name || all(old_def.references, function(ref) { && (old_def.name == def.name.name || all(old_def.references, function(ref) {
return ref.scope.find_variable(def.name) === def.name.definition(); return ref.scope.find_variable(def.name) === def.name.definition();
}))) })))
&& can_rename(def.value, def.name.name) && can_declare_defun()
&& (!compressor.has_directive("use strict") || parent instanceof AST_Scope)) { && can_rename(def.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));
var defun = make_node(AST_Defun, def, def.value); var defun = make_node(AST_Defun, def, def.value);
defun.name = make_node(AST_SymbolDefun, def.name, def.name); defun.name = make_node(AST_SymbolDefun, def.name, def.name);
@@ -4908,6 +4908,13 @@ merge(Compressor.prototype, {
var def = fn.variables.get(name); var def = fn.variables.get(name);
return !def || fn.name && def === fn.name.definition(); return !def || fn.name && def === fn.name.definition();
} }
function can_declare_defun() {
if (compressor.has_directive("use strict")) return parent instanceof AST_Scope;
return parent instanceof AST_Block
|| parent instanceof AST_For && parent.init === node
|| parent instanceof AST_If;
}
}); });
switch (head.length) { switch (head.length) {
case 0: case 0:

View File

@@ -4892,3 +4892,71 @@ direct_inline_catch_redefined: {
} }
expect_stdout: true expect_stdout: true
} }
issue_4171_1: {
options = {
functions: true,
reduce_vars: true,
unused: true,
}
input: {
console.log(function(a) {
try {
while (a)
var e = function() {};
} catch (e) {
return function() {
return e;
};
}
}(!console));
}
expect: {
console.log(function(a) {
try {
while (a)
var e = function() {};
} catch (e) {
return function() {
return e;
};
}
}(!console));
}
expect_stdout: "undefined"
}
issue_4171_2: {
options = {
functions: true,
reduce_vars: true,
unused: true,
}
input: {
console.log(function(a) {
try {
while (a);
} catch (e) {
return function() {
return e;
};
} finally {
var e = function() {};
}
}(!console));
}
expect: {
console.log(function(a) {
try {
while (a);
} catch (e) {
return function() {
return e;
};
} finally {
function e() {}
}
}(!console));
}
expect_stdout: "undefined"
}