void (PsiExpression expression, PsiExpression[] operands, PsiType exprType, boolean and) { DeferredOffset endOffset = new DeferredOffset(); for (int i = 0; i < operands.length; i++) { PsiExpression operand = operands[i]; operand.accept(this); generateBoxingUnboxingInstructionFor(operand, exprType); PsiExpression nextOperand = i == operands.length - 1 ? null : operands[i + 1]; if (nextOperand != null) { DeferredOffset nextOffset = new DeferredOffset(); addInstruction(new ConditionalGotoInstruction(nextOffset, DfTypes.booleanValue(and), operand)); push(DfTypes.booleanValue(!and), expression); addInstruction(new GotoInstruction(endOffset)); nextOffset.setOffset(getInstructionCount()); addInstruction(new FinishElementInstruction(null)); } } endOffset.setOffset(getInstructionCount()); addInstruction(new ResultOfInstruction(new JavaExpressionAnchor(expression))); }