return null;
}
private Expression reduceBooleanConstantComparison(final BinaryExpression node) {
final Expression left = visit(node.getLeft());
final Expression right = visit(node.getRight());
final ExpressionType nodeType = node.getNodeType();
if (node.getType() != PrimitiveTypes.Boolean ||
nodeType != ExpressionType.Equal && nodeType != ExpressionType.NotEqual) {
return null;
}
if (ConstantCheck.isTrue(right)) {
// true [op] true
if (ConstantCheck.isTrue(left)) {
return constant(nodeType == ExpressionType.Equal);
}
// false [op] true
if (ConstantCheck.isFalse(left)) {
return constant(nodeType == ExpressionType.NotEqual);
}
// expr [op] true
if (TypeUtils.getUnderlyingPrimitiveOrSelf(left.getType()) == PrimitiveTypes.Boolean) {
return nodeType == ExpressionType.Equal ? left : isFalse(left);
}
return null;
}
if (ConstantCheck.isFalse(right)) {
// false [op] false
if (ConstantCheck.isFalse(left)) {
return constant(nodeType == ExpressionType.Equal);
}
// true [op] false
if (ConstantCheck.isTrue(left)) {
return constant(nodeType == ExpressionType.NotEqual);
}
// expr [op] false
if (TypeUtils.getUnderlyingPrimitiveOrSelf(left.getType()) == PrimitiveTypes.Boolean) {
return nodeType == ExpressionType.Equal ? isFalse(left) : left;
}
return null;
}
if (ConstantCheck.isTrue(left)) {
// true [op] expr
if (TypeUtils.getUnderlyingPrimitiveOrSelf(right.getType()) == PrimitiveTypes.Boolean) {
return nodeType == ExpressionType.Equal ? right : isFalse(right);
}
}
else if (ConstantCheck.isFalse(left)) {
// false [op] expr
if (TypeUtils.getUnderlyingPrimitiveOrSelf(right.getType()) == PrimitiveTypes.Boolean) {
return nodeType == ExpressionType.NotEqual ? right : isFalse(right);
}
}
return null;