void (PsiPolyadicExpression expression, StringBuilder out, CommentTracker tracker) { final IElementType tokenType = expression.getOperationTokenType(); final PsiExpression[] operands = expression.getOperands(); final List<PsiExpression> expressions = new ArrayList<>(); if (tokenType.equals(JavaTokenType.ANDAND) || tokenType.equals(JavaTokenType.AND)) { for (PsiExpression operand : operands) { if (evaluate(operand) == Boolean.TRUE) { continue; } if (evaluate(operand) == Boolean.FALSE) { out.append(PsiKeyword.FALSE); return; } expressions.add(operand); } if (expressions.isEmpty()) { out.append(PsiKeyword.TRUE); return; } buildSimplifiedExpression(expressions, tokenType.equals(JavaTokenType.ANDAND) ? "&&" : "&", false, out, tracker); } else if (tokenType.equals(JavaTokenType.OROR) || tokenType.equals(JavaTokenType.OR)) { for (PsiExpression operand : operands) { if (evaluate(operand) == Boolean.FALSE) { continue; } if (evaluate(operand) == Boolean.TRUE) { out.append(PsiKeyword.TRUE); return; } expressions.add(operand); } if (expressions.isEmpty()) { out.append(PsiKeyword.FALSE); return; } buildSimplifiedExpression(expressions, tokenType.equals(JavaTokenType.OROR) ? "||" : "|", false, out, tracker); } else if (tokenType.equals(JavaTokenType.XOR) || tokenType.equals(JavaTokenType.NE)) { boolean negate = false; for (PsiExpression operand : operands) { if (evaluate(operand) == Boolean.FALSE) { continue; } if (evaluate(operand) == Boolean.TRUE) { negate = !negate; continue; } expressions.add(operand); } if (expressions.isEmpty()) { if (negate) { out.append(PsiKeyword.TRUE); } else { out.append(PsiKeyword.FALSE); } return; } buildSimplifiedExpression(expressions, tokenType.equals(JavaTokenType.XOR) ? "^" : "!=", negate, out, tracker); } else if (tokenType.equals(JavaTokenType.EQEQ)) { boolean negate = false; for (PsiExpression operand : operands) { if (evaluate(operand) == Boolean.TRUE) { continue; } if (evaluate(operand) == Boolean.FALSE) { negate = !negate; continue; } expressions.add(operand); } if (expressions.isEmpty()) { if (negate) { out.append(PsiKeyword.FALSE); } else { out.append(PsiKeyword.TRUE); } return; } buildSimplifiedExpression(expressions, "==", negate, out, tracker); } else { out.append(tracker.text(expression)); } }