enhance booleans & evaluate (#5364)

This commit is contained in:
Alex Lam S.L
2022-02-20 17:25:37 +00:00
committed by GitHub
parent 212ce4608e
commit d5afe16bc8
3 changed files with 70 additions and 43 deletions

View File

@@ -11134,21 +11134,17 @@ Compressor.prototype.compress = function(node) {
}
if (in_bool) switch (self.operator) {
case "+":
var ll = self.left.evaluate(compressor);
var rr = self.right.evaluate(compressor);
if (ll && typeof ll == "string") {
var ev = self.left.evaluate(compressor, true);
if (ev && typeof ev == "string" || (ev = self.right.evaluate(compressor, true)) && typeof ev == "string") {
AST_Node.warn("+ in boolean context always true [{file}:{line},{col}]", self.start);
return make_sequence(self, [
self.right,
make_node(AST_True, self)
]).optimize(compressor);
}
if (rr && typeof rr == "string") {
AST_Node.warn("+ in boolean context always true [{file}:{line},{col}]", self.start);
return make_sequence(self, [
self.left,
make_node(AST_True, self)
]).optimize(compressor);
var exprs = [];
if (self.left.evaluate(compressor) instanceof AST_Node) exprs.push(self.left);
if (self.right.evaluate(compressor) instanceof AST_Node) exprs.push(self.right);
if (exprs.length < 2) {
exprs.push(make_node(AST_True, self));
return make_sequence(self, exprs).optimize(compressor);
}
self.truthy = true;
}
break;
case "==":
@@ -11231,20 +11227,15 @@ Compressor.prototype.compress = function(node) {
AST_Node.warn("Condition left of && always true [{file}:{line},{col}]", self.start);
return make_sequence(self, [ self.left, self.right ]).optimize(compressor);
}
var rr = self.right.evaluate(compressor);
if (!rr) {
if (in_bool) {
if (!self.right.evaluate(compressor, true)) {
if (in_bool && !(self.right.evaluate(compressor) instanceof AST_Node)) {
AST_Node.warn("Boolean && always false [{file}:{line},{col}]", self.start);
return make_sequence(self, [
self.left,
make_node(AST_False, self)
]).optimize(compressor);
return make_sequence(self, [ self.left, make_node(AST_False, self) ]).optimize(compressor);
} else self.falsy = true;
} else if (!(rr instanceof AST_Node)) {
if (in_bool || parent.operator == "&&" && parent.left === compressor.self()) {
AST_Node.warn("Dropping side-effect-free && [{file}:{line},{col}]", self.start);
return self.left.optimize(compressor);
}
} else if ((in_bool || parent.operator == "&&" && parent.left === compressor.self())
&& !(self.right.evaluate(compressor) instanceof AST_Node)) {
AST_Node.warn("Dropping side-effect-free && [{file}:{line},{col}]", self.start);
return self.left.optimize(compressor);
}
// (x || false) && y ---> x ? y : false
if (self.left.operator == "||") {
@@ -11279,25 +11270,21 @@ Compressor.prototype.compress = function(node) {
});
return maintain_this_binding(compressor, parent, compressor.self(), self.left).optimize(compressor);
}
var rr = self.right.evaluate(compressor);
if (!rr) {
if (in_bool || parent.operator == "||" && parent.left === compressor.self()) {
AST_Node.warn("Dropping side-effect-free {operator} [{file}:{line},{col}]", {
operator: self.operator,
file: self.start.file,
line: self.start.line,
col: self.start.col,
});
return self.left.optimize(compressor);
}
} else if (!nullish && !(rr instanceof AST_Node)) {
if (in_bool) {
var rr;
if (!nullish && (rr = self.right.evaluate(compressor, true)) && !(rr instanceof AST_Node)) {
if (in_bool && !(self.right.evaluate(compressor) instanceof AST_Node)) {
AST_Node.warn("Boolean || always true [{file}:{line},{col}]", self.start);
return make_sequence(self, [
self.left,
make_node(AST_True, self)
]).optimize(compressor);
return make_sequence(self, [ self.left, make_node(AST_True, self) ]).optimize(compressor);
} else self.truthy = true;
} else if ((in_bool || parent.operator == "||" && parent.left === compressor.self())
&& !self.right.evaluate(compressor)) {
AST_Node.warn("Dropping side-effect-free {operator} [{file}:{line},{col}]", {
operator: self.operator,
file: self.start.file,
line: self.start.line,
col: self.start.col,
});
return self.left.optimize(compressor);
}
// x && true || y ---> x ? true : y
if (!nullish && self.left.operator == "&&") {