void (PsiUnaryExpression expression, PsiExpression operand, boolean postIncrement) { LongRangeBinOp token; IElementType exprTokenType = expression.getOperationTokenType(); if (exprTokenType.equals(JavaTokenType.MINUSMINUS)) { token = LongRangeBinOp.MINUS; } else if (exprTokenType.equals(JavaTokenType.PLUSPLUS)) { token = LongRangeBinOp.PLUS; } else { throw new IllegalArgumentException("Unexpected token: " + exprTokenType); } PsiType operandType = operand.getType(); PsiArrayAccessExpression arrayStore = ObjectUtils.tryCast(operand, PsiArrayAccessExpression.class); if (arrayStore == null) { operand.accept(this); addInstruction(new DupInstruction()); // stack: operand, old_value } else { pushArrayAndIndex(arrayStore); addInstruction(new SpliceInstruction(2, 1, 0, 1, 0)); readArrayElement(arrayStore); // stack: array, index, old_value } if (postIncrement) { if (arrayStore != null) { addInstruction(new SpliceInstruction(3, 0, 2, 1, 0)); // stack: old_value, array, index, old_value } else { addInstruction(new SpliceInstruction(2, 0, 1, 0)); // stack: old_value, operand, old_value } } PsiPrimitiveType unboxedType = PsiPrimitiveType.getOptionallyUnboxedType(operandType); if (unboxedType == null) { // Unknown type; likely erroneous code: replace old_value with unknown addInstruction(new PopInstruction()); pushUnknown(); } else { generateBoxingUnboxingInstructionFor(operand, unboxedType); PsiType resultType = TypeConversionUtil.binaryNumericPromotion(unboxedType, PsiTypes.intType()); Object addend = TypeConversionUtil.computeCastTo(1, resultType); addInstruction(new PushValueInstruction(DfTypes.primitiveConstant(addend))); addInstruction(new NumericBinaryInstruction(token, null)); if (!unboxedType.equals(resultType)) { addInstruction(new PrimitiveConversionInstruction(unboxedType, null)); } if (!(operandType instanceof PsiPrimitiveType)) { addInstruction(new WrapDerivedVariableInstruction(DfTypes.typedObject(operandType, Nullability.NOT_NULL), SpecialField.UNBOX)); } } DfaValue dest = JavaDfaValueFactory.getExpressionDfaValue(myFactory, operand); if (arrayStore != null) { addInstruction(new JavaArrayStoreInstruction(arrayStore, null, null, ObjectUtils.tryCast(dest, DfaVariableValue.class))); } else { addInstruction(new AssignInstruction(operand, null, dest)); } if (postIncrement) { addInstruction(new PopInstruction()); } addInstruction(new ResultOfInstruction(new JavaExpressionAnchor(expression))); }