String (PsiExpression left, PsiExpression right, boolean isAnd, CommentTracker ct) { int precedence; String token; IElementType tokenType; if (isAnd) { precedence = ParenthesesUtils.AND_PRECEDENCE; token = " && "; tokenType = JavaTokenType.ANDAND; } else { precedence = ParenthesesUtils.OR_PRECEDENCE; token = " || "; tokenType = JavaTokenType.OROR; } PsiPolyadicExpression leftPolyadic = tryCast(PsiUtil.skipParenthesizedExprDown(left), PsiPolyadicExpression.class); PsiPolyadicExpression rightPolyadic = tryCast(PsiUtil.skipParenthesizedExprDown(right), PsiPolyadicExpression.class); // foo && (foo && bar) -> foo && bar if (rightPolyadic != null && rightPolyadic.getOperationTokenType().equals(tokenType) && EquivalenceChecker.getCanonicalPsiEquivalence() .expressionsAreEquivalent(ArrayUtil.getFirstElement(rightPolyadic.getOperands()), left) && !SideEffectChecker.mayHaveSideEffects(left)) { return ct.text(rightPolyadic); } // (foo && bar) && bar -> foo && bar if (leftPolyadic != null && leftPolyadic.getOperationTokenType().equals(tokenType) && EquivalenceChecker.getCanonicalPsiEquivalence() .expressionsAreEquivalent(ArrayUtil.getLastElement(leftPolyadic.getOperands()), right) && !SideEffectChecker.mayHaveSideEffects(right)) { return ct.text(leftPolyadic); } return ct.text(left, precedence) + token + ct.text(right, precedence); }