Don't drop unused if scope uses with statement

Fix provided by @kzc
This commit is contained in:
Anthony Van de Gejuchte
2016-06-10 00:34:20 +02:00
committed by Richard van Velzen
parent 4d7746baf3
commit ea31da2455
2 changed files with 148 additions and 0 deletions

View File

@@ -1326,6 +1326,7 @@ merge(Compressor.prototype, {
if (compressor.option("unused") if (compressor.option("unused")
&& !(self instanceof AST_Toplevel) && !(self instanceof AST_Toplevel)
&& !self.uses_eval && !self.uses_eval
&& !self.uses_with
) { ) {
var in_use = []; var in_use = [];
var in_use_ids = {}; // avoid expensive linear scans of in_use var in_use_ids = {}; // avoid expensive linear scans of in_use

147
test/compress/issue-1105.js Normal file
View File

@@ -0,0 +1,147 @@
with_in_global_scope: {
options = {
unused: true
}
input: {
var o = 42;
with(o) {
var foo = 'something'
}
doSomething(o);
}
expect: {
var o=42;
with(o)
var foo = "something";
doSomething(o);
}
}
with_in_function_scope: {
options = {
unused: true
}
input: {
function foo() {
var o = 42;
with(o) {
var foo = "something"
}
doSomething(o);
}
}
expect: {
function foo() {
var o=42;
with(o)
var foo = "something";
doSomething(o)
}
}
}
compress_with_with_in_other_scope: {
options = {
unused: true
}
input: {
function foo() {
var o = 42;
with(o) {
var foo = "something"
}
doSomething(o);
}
function bar() {
var unused = 42;
return something();
}
}
expect: {
function foo() {
var o = 42;
with(o)
var foo = "something";
doSomething(o)
}
function bar() {
return something()
}
}
}
with_using_existing_variable_outside_scope: {
options = {
unused: true
}
input: {
function f() {
var o = {};
var unused = {}; // Doesn't get removed because upper scope uses with
function foo() {
with(o) {
var foo = "something"
}
doSomething(o);
}
foo()
}
}
expect: {
function f() {
var o = {};
var unused = {};
function foo() {
with(o)
var foo = "something";
doSomething(o)
}
foo()
}
}
}
check_drop_unused_in_peer_function: {
options = {
unused: true
}
input: {
function outer() {
var o = {};
var unused = {}; // should be kept
function foo() { // should be kept
function not_in_use() {
var nested_unused = "foo"; // should be dropped
return 24;
}
var unused = {}; // should be kept
with (o) {
var foo = "something";
}
doSomething(o);
}
function bar() {
var unused = {}; // should be dropped
doSomethingElse();
}
foo();
bar();
}
}
expect: {
function outer() {
var o = {};
var unused = {}; // should be kept
function foo() { // should be kept
function not_in_use() {
return 24;
}
var unused = {}; // should be kept
with (o)
var foo = "something";
doSomething(o);
}
function bar() {
doSomethingElse();
}
foo();
bar();
}
}
}