void (@NotNull PsiPolyadicExpression expression) { startElement(expression); IElementType signTokenType = expression.getOperationTokenType(); boolean isAndAnd = signTokenType == JavaTokenType.ANDAND; boolean isOrOr = signTokenType == JavaTokenType.OROR; PsiExpression[] operands = expression.getOperands(); Boolean lValue = isAndAnd; PsiExpression lOperand = null; Boolean rValue = null; for (int i = 0; i < operands.length; i++) { PsiExpression rOperand = operands[i]; if ((isAndAnd || isOrOr) && myOptions.enableShortCircuit()) { Object exprValue = myConstantEvaluationHelper.computeConstantExpression(rOperand); if (exprValue instanceof Boolean) { myCurrentFlow.setConstantConditionOccurred(true); rValue = shouldCalculateConstantExpression(expression) ? (Boolean)exprValue : null; } else { rValue = null; } BranchingInstruction.Role role = isAndAnd ? myEndJumpRoles.peek() : myStartJumpRoles.peek(); PsiElement gotoElement = isAndAnd ? myEndStatementStack.peekElement() : myStartStatementStack.peekElement(); boolean gotoIsAtStart = isAndAnd ? myEndStatementStack.peekAtStart() : myStartStatementStack.peekAtStart(); Shortcut shortcut; if (lValue != null) { shortcut = lValue.booleanValue() == isOrOr ? Shortcut.STOP_EXPRESSION : Shortcut.SKIP_CURRENT_OPERAND; } else if (rValue != null && rValue.booleanValue() == isOrOr) { shortcut = Shortcut.STOP_EXPRESSION; } else { shortcut = Shortcut.NO_SHORTCUT; } switch (shortcut) { case NO_SHORTCUT: myCurrentFlow.addInstruction(new ConditionalGoToInstruction(0, role, lOperand)); addElementOffsetLater(gotoElement, gotoIsAtStart); break; case STOP_EXPRESSION: myCurrentFlow.addInstruction(new GoToInstruction(0, role)); addElementOffsetLater(gotoElement, gotoIsAtStart); rValue = null; break; case SKIP_CURRENT_OPERAND: break; } } generateLOperand(rOperand, i == operands.length - 1 ? null : operands[i + 1], signTokenType); lOperand = rOperand; lValue = rValue; } finishElement(expression); }