combine rules for binary boolean operations (#1744)
This commit is contained in:
@@ -3140,42 +3140,7 @@ merge(Compressor.prototype, {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (compressor.option("booleans") && compressor.in_boolean_context()) switch (self.operator) {
|
if (compressor.option("booleans") && self.operator == "+" && compressor.in_boolean_context()) {
|
||||||
case "&&":
|
|
||||||
var ll = self.left.evaluate(compressor);
|
|
||||||
var rr = self.right.evaluate(compressor);
|
|
||||||
if (!ll || !rr) {
|
|
||||||
compressor.warn("Boolean && always false [{file}:{line},{col}]", self.start);
|
|
||||||
return make_node(AST_Seq, self, {
|
|
||||||
car: self.left,
|
|
||||||
cdr: make_node(AST_False, self)
|
|
||||||
}).optimize(compressor);
|
|
||||||
}
|
|
||||||
if (ll !== self.left && ll) {
|
|
||||||
return self.right.optimize(compressor);
|
|
||||||
}
|
|
||||||
if (rr !== self.right && rr) {
|
|
||||||
return self.left.optimize(compressor);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "||":
|
|
||||||
var ll = self.left.evaluate(compressor);
|
|
||||||
var rr = self.right.evaluate(compressor);
|
|
||||||
if (ll !== self.left && ll || rr !== self.right && rr) {
|
|
||||||
compressor.warn("Boolean || always true [{file}:{line},{col}]", self.start);
|
|
||||||
return make_node(AST_Seq, self, {
|
|
||||||
car: self.left,
|
|
||||||
cdr: make_node(AST_True, self)
|
|
||||||
}).optimize(compressor);
|
|
||||||
}
|
|
||||||
if (!ll) {
|
|
||||||
return self.right.optimize(compressor);
|
|
||||||
}
|
|
||||||
if (!rr) {
|
|
||||||
return self.left.optimize(compressor);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "+":
|
|
||||||
var ll = self.left.evaluate(compressor);
|
var ll = self.left.evaluate(compressor);
|
||||||
var rr = self.right.evaluate(compressor);
|
var rr = self.right.evaluate(compressor);
|
||||||
if (ll && typeof ll == "string") {
|
if (ll && typeof ll == "string") {
|
||||||
@@ -3192,7 +3157,6 @@ merge(Compressor.prototype, {
|
|||||||
cdr: make_node(AST_True, self)
|
cdr: make_node(AST_True, self)
|
||||||
}).optimize(compressor);
|
}).optimize(compressor);
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
if (compressor.option("comparisons") && self.is_boolean()) {
|
if (compressor.option("comparisons") && self.is_boolean()) {
|
||||||
if (!(compressor.parent() instanceof AST_Binary)
|
if (!(compressor.parent() instanceof AST_Binary)
|
||||||
@@ -3233,24 +3197,48 @@ merge(Compressor.prototype, {
|
|||||||
if (compressor.option("evaluate")) {
|
if (compressor.option("evaluate")) {
|
||||||
switch (self.operator) {
|
switch (self.operator) {
|
||||||
case "&&":
|
case "&&":
|
||||||
if (self.left.is_constant()) {
|
var ll = self.left.evaluate(compressor);
|
||||||
if (self.left.constant_value(compressor)) {
|
if (!ll) {
|
||||||
compressor.warn("Condition left of && always true [{file}:{line},{col}]", self.start);
|
|
||||||
return maintain_this_binding(compressor.parent(), self, self.right);
|
|
||||||
} else {
|
|
||||||
compressor.warn("Condition left of && always false [{file}:{line},{col}]", self.start);
|
compressor.warn("Condition left of && always false [{file}:{line},{col}]", self.start);
|
||||||
return maintain_this_binding(compressor.parent(), self, self.left);
|
return maintain_this_binding(compressor.parent(), self, self.left).optimize(compressor);
|
||||||
|
} else if (ll !== self.left) {
|
||||||
|
compressor.warn("Condition left of && always true [{file}:{line},{col}]", self.start);
|
||||||
|
return maintain_this_binding(compressor.parent(), self, self.right).optimize(compressor);
|
||||||
|
}
|
||||||
|
if (compressor.option("booleans") && compressor.in_boolean_context()) {
|
||||||
|
var rr = self.right.evaluate(compressor);
|
||||||
|
if (!rr) {
|
||||||
|
compressor.warn("Boolean && always false [{file}:{line},{col}]", self.start);
|
||||||
|
return make_node(AST_Seq, self, {
|
||||||
|
car: self.left,
|
||||||
|
cdr: make_node(AST_False, self)
|
||||||
|
}).optimize(compressor);
|
||||||
|
} else if (rr !== self.right) {
|
||||||
|
compressor.warn("Dropping side-effect-free && in boolean context [{file}:{line},{col}]", self.start);
|
||||||
|
return self.left.optimize(compressor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "||":
|
case "||":
|
||||||
if (self.left.is_constant()) {
|
var ll = self.left.evaluate(compressor);
|
||||||
if (self.left.constant_value(compressor)) {
|
if (!ll) {
|
||||||
compressor.warn("Condition left of || always true [{file}:{line},{col}]", self.start);
|
|
||||||
return maintain_this_binding(compressor.parent(), self, self.left);
|
|
||||||
} else {
|
|
||||||
compressor.warn("Condition left of || always false [{file}:{line},{col}]", self.start);
|
compressor.warn("Condition left of || always false [{file}:{line},{col}]", self.start);
|
||||||
return maintain_this_binding(compressor.parent(), self, self.right);
|
return maintain_this_binding(compressor.parent(), self, self.right).optimize(compressor);
|
||||||
|
} else if (ll !== self.left) {
|
||||||
|
compressor.warn("Condition left of || always true [{file}:{line},{col}]", self.start);
|
||||||
|
return maintain_this_binding(compressor.parent(), self, self.left).optimize(compressor);
|
||||||
|
}
|
||||||
|
if (compressor.option("booleans") && compressor.in_boolean_context()) {
|
||||||
|
var rr = self.right.evaluate(compressor);
|
||||||
|
if (!rr) {
|
||||||
|
compressor.warn("Dropping side-effect-free || in boolean context [{file}:{line},{col}]", self.start);
|
||||||
|
return self.left.optimize(compressor);
|
||||||
|
} else if (rr !== self.right) {
|
||||||
|
compressor.warn("Boolean || always true [{file}:{line},{col}]", self.start);
|
||||||
|
return make_node(AST_Seq, self, {
|
||||||
|
car: self.left,
|
||||||
|
cdr: make_node(AST_True, self)
|
||||||
|
}).optimize(compressor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -154,12 +154,12 @@ should_warn: {
|
|||||||
"WARN: Boolean || always true [test/compress/issue-1261.js:129,23]",
|
"WARN: Boolean || always true [test/compress/issue-1261.js:129,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:129,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:129,23]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:129,23]",
|
"WARN: Condition always true [test/compress/issue-1261.js:129,23]",
|
||||||
"WARN: Boolean || always true [test/compress/issue-1261.js:130,8]",
|
"WARN: Condition left of || always true [test/compress/issue-1261.js:130,8]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:130,8]",
|
"WARN: Condition always true [test/compress/issue-1261.js:130,8]",
|
||||||
"WARN: Boolean && always false [test/compress/issue-1261.js:131,23]",
|
"WARN: Boolean && always false [test/compress/issue-1261.js:131,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:131,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:131,23]",
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:131,23]",
|
"WARN: Condition always false [test/compress/issue-1261.js:131,23]",
|
||||||
"WARN: Boolean && always false [test/compress/issue-1261.js:132,8]",
|
"WARN: Condition left of && always false [test/compress/issue-1261.js:132,8]",
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:132,8]",
|
"WARN: Condition always false [test/compress/issue-1261.js:132,8]",
|
||||||
"WARN: + in boolean context always true [test/compress/issue-1261.js:133,23]",
|
"WARN: + in boolean context always true [test/compress/issue-1261.js:133,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:133,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:133,23]",
|
||||||
|
|||||||
Reference in New Issue
Block a user