if (op == JBinaryOperator.AND) {
// simplify short circuit AND expressions
if (lhs instanceof JBooleanLiteral) {
// eg: if (false && isWhatever()) -> if (false)
// eg: if (true && isWhatever()) -> if (isWhatever())
JBooleanLiteral booleanLiteral = (JBooleanLiteral) lhs;
if (booleanLiteral.getValue()) {
ctx.replaceMe(rhs);
} else {
ctx.replaceMe(lhs);
}
} else if (rhs instanceof JBooleanLiteral) {
// eg: if (isWhatever() && true) -> if (isWhatever())
// eg: if (isWhatever() && false) -> if (false), unless side effects
JBooleanLiteral booleanLiteral = (JBooleanLiteral) rhs;
if (booleanLiteral.getValue()) {
ctx.replaceMe(lhs);
} else if (!lhs.hasSideEffects()) {
ctx.replaceMe(rhs);
}
}
} else if (op == JBinaryOperator.OR) {
// simplify short circuit OR expressions
if (lhs instanceof JBooleanLiteral) {
// eg: if (true || isWhatever()) -> if (true)
// eg: if (false || isWhatever()) -> if (isWhatever())
JBooleanLiteral booleanLiteral = (JBooleanLiteral) lhs;
if (booleanLiteral.getValue()) {
ctx.replaceMe(lhs);
} else {
ctx.replaceMe(rhs);
}
} else if (rhs instanceof JBooleanLiteral) {
// eg: if (isWhatever() || false) -> if (isWhatever())
// eg: if (isWhatever() && true) -> if (true), unless side effects
JBooleanLiteral booleanLiteral = (JBooleanLiteral) rhs;
if (!booleanLiteral.getValue()) {
ctx.replaceMe(lhs);
} else if (!lhs.hasSideEffects()) {
ctx.replaceMe(rhs);
}
}