void (@NotNull GrBinaryExpression expression) { final GrExpression left = expression.getLeftOperand(); final GrExpression right = expression.getRightOperand(); final IElementType opType = expression.getOperationTokenType(); if (ControlFlowBuilderUtil.isInstanceOfBinary(expression)) { expression.getLeftOperand().accept(this); processInstanceOf(expression, GrInExpression.isNegated((GrInExpression)expression)); return; } if (opType == T_EQ || opType == T_NEQ) { if (isNullLiteral(right)) { left.accept(this); processInstanceOf(expression, opType == T_NEQ); return; } else if (right != null && isNullLiteral(left)) { right.accept(this); processInstanceOf(expression, opType == T_NEQ); return; } } if (opType != GroovyTokenTypes.mLOR && opType != GroovyTokenTypes.mLAND && opType != KW_IN && opType != T_NOT_IN) { left.accept(this); if (right != null) { right.accept(this); } visitCall(expression); return; } FList<ConditionInstruction> conditionsBefore = myConditions; ConditionInstruction condition = registerCondition(expression, false); addNodeAndCheckPending(condition); left.accept(this); if (right == null) return; final List<GotoInstruction> negations = collectAndRemoveAllPendingNegations(expression); visitCall(expression); if (opType == GroovyTokenTypes.mLAND) { InstructionImpl head = myHead; if (negations.isEmpty()) { addNode(new NegatingGotoInstruction(expression, condition)); handlePossibleReturn(expression); addPendingEdge(expression, myHead); } else { for (GotoInstruction negation : negations) { myHead = negation; handlePossibleReturn(expression); addPendingEdge(expression, myHead); } } myHead = head; } else /*if (opType == mLOR)*/ { final InstructionImpl instruction = addNodeAndCheckPending(new InstructionImpl(expression));//collect all pending edges from left argument handlePossibleReturn(expression); addPendingEdge(expression, myHead); myHead = instruction; InstructionImpl head = reduceAllNegationsIntoInstruction(expression, negations); if (head != null) myHead = head; //addNode(new NegatingGotoInstruction(expression, myInstructionNumber++, condition)); } myConditions = conditionsBefore; right.accept(this); }