Object (Object lOperandValue, Object rOperandValue, IElementType tokenType, PsiPolyadicExpression expression) { Object value = null; if (tokenType == JavaTokenType.PLUS) { if (lOperandValue instanceof String || rOperandValue instanceof String) { String l = computeValueToString(lOperandValue); String r = computeValueToString(rOperandValue); value = l + r; } else { if (lOperandValue instanceof Character) lOperandValue = Integer.valueOf(((Character)lOperandValue).charValue()); if (rOperandValue instanceof Character) rOperandValue = Integer.valueOf(((Character)rOperandValue).charValue()); if (lOperandValue instanceof Number && rOperandValue instanceof Number) { if (lOperandValue instanceof Double || rOperandValue instanceof Double) { value = Double.valueOf(((Number)lOperandValue).doubleValue() + ((Number)rOperandValue).doubleValue()); checkRealNumberOverflow(value, lOperandValue, rOperandValue,expression); } else if (lOperandValue instanceof Float || rOperandValue instanceof Float) { value = Float.valueOf(((Number)lOperandValue).floatValue() + ((Number)rOperandValue).floatValue()); checkRealNumberOverflow(value, lOperandValue, rOperandValue, expression); } else if (lOperandValue instanceof Long || rOperandValue instanceof Long) { final long l = ((Number)lOperandValue).longValue(); final long r = ((Number)rOperandValue).longValue(); value = Long.valueOf(l + r); checkAdditionOverflow(((Long)value).longValue() >= 0, l >= 0, r >= 0, expression); } else { final int l = ((Number)lOperandValue).intValue(); final int r = ((Number)rOperandValue).intValue(); value = Integer.valueOf(l + r); checkAdditionOverflow(((Integer)value).intValue() >= 0, l >= 0, r >= 0, expression); } } } } else if (tokenType == JavaTokenType.MINUS) { if (lOperandValue instanceof Character) lOperandValue = Integer.valueOf(((Character)lOperandValue).charValue()); if (rOperandValue instanceof Character) rOperandValue = Integer.valueOf(((Character)rOperandValue).charValue()); if (lOperandValue instanceof Number && rOperandValue instanceof Number) { if (lOperandValue instanceof Double || rOperandValue instanceof Double) { value = Double.valueOf(((Number)lOperandValue).doubleValue() - ((Number)rOperandValue).doubleValue()); checkRealNumberOverflow(value, lOperandValue, rOperandValue, expression); } else if (lOperandValue instanceof Float || rOperandValue instanceof Float) { value = Float.valueOf(((Number)lOperandValue).floatValue() - ((Number)rOperandValue).floatValue()); checkRealNumberOverflow(value, lOperandValue, rOperandValue, expression); } else if (lOperandValue instanceof Long || rOperandValue instanceof Long) { final long l = ((Number)lOperandValue).longValue(); final long r = ((Number)rOperandValue).longValue(); value = Long.valueOf(l - r); checkAdditionOverflow(((Long)value).longValue() >= 0, l >= 0, r < 0, expression); } else { final int l = ((Number)lOperandValue).intValue(); final int r = ((Number)rOperandValue).intValue(); value = Integer.valueOf(l - r); checkAdditionOverflow(((Integer)value).intValue() >= 0, l >= 0, r < 0, expression); } } } else if (tokenType == JavaTokenType.ANDAND) { if (lOperandValue instanceof Boolean && rOperandValue instanceof Boolean) { value = Boolean.valueOf(((Boolean)lOperandValue).booleanValue() && ((Boolean)rOperandValue).booleanValue()); } else if (lOperandValue instanceof Boolean && !((Boolean)lOperandValue).booleanValue() || rOperandValue instanceof Boolean && !((Boolean)rOperandValue).booleanValue()) { value = Boolean.FALSE; } } else if (tokenType == JavaTokenType.OROR) { if (lOperandValue instanceof Boolean && rOperandValue instanceof Boolean) { value = Boolean.valueOf(((Boolean)lOperandValue).booleanValue() || ((Boolean)rOperandValue).booleanValue()); } else if (lOperandValue instanceof Boolean && ((Boolean)lOperandValue).booleanValue() || rOperandValue instanceof Boolean && ((Boolean)rOperandValue).booleanValue()) { value = Boolean.TRUE; } } else if (tokenType == JavaTokenType.LT || tokenType == JavaTokenType.LE || tokenType == JavaTokenType.GT || tokenType == JavaTokenType.GE) { value = compareNumbers(lOperandValue, rOperandValue, tokenType); } else if (tokenType == JavaTokenType.EQEQ || tokenType == JavaTokenType.NE) { value = handleEqualityComparison(lOperandValue, rOperandValue, tokenType); } else if (tokenType == JavaTokenType.ASTERISK) { if (lOperandValue instanceof Character) lOperandValue = Integer.valueOf(((Character)lOperandValue).charValue()); if (rOperandValue instanceof Character) rOperandValue = Integer.valueOf(((Character)rOperandValue).charValue()); if (lOperandValue instanceof Number && rOperandValue instanceof Number) { if (lOperandValue instanceof Double || rOperandValue instanceof Double) { value = Double.valueOf(((Number)lOperandValue).doubleValue() * ((Number)rOperandValue).doubleValue()); checkRealNumberOverflow(value, lOperandValue, rOperandValue, expression); } else if (lOperandValue instanceof Float || rOperandValue instanceof Float) { value = Float.valueOf(((Number)lOperandValue).floatValue() * ((Number)rOperandValue).floatValue()); checkRealNumberOverflow(value, lOperandValue, rOperandValue, expression); } else if (lOperandValue instanceof Long || rOperandValue instanceof Long) { final long l = ((Number)lOperandValue).longValue(); final long r = ((Number)rOperandValue).longValue(); value = Long.valueOf(l * r); checkMultiplicationOverflow(((Long)value).longValue(), l, r, expression); } else { final int l = ((Number)lOperandValue).intValue(); final int r = ((Number)rOperandValue).intValue(); value = Integer.valueOf(l * r); checkMultiplicationOverflow(((Integer)value).intValue(), l, r, expression); } } } else if (tokenType == JavaTokenType.DIV) { if (lOperandValue instanceof Character) lOperandValue = Integer.valueOf(((Character)lOperandValue).charValue()); if (rOperandValue instanceof Character) rOperandValue = Integer.valueOf(((Character)rOperandValue).charValue()); if (lOperandValue instanceof Number && rOperandValue instanceof Number) { if (lOperandValue instanceof Double || rOperandValue instanceof Double) { value = Double.valueOf(((Number)lOperandValue).doubleValue() / ((Number)rOperandValue).doubleValue()); checkRealNumberOverflow(value, lOperandValue, rOperandValue, expression); } else if (lOperandValue instanceof Float || rOperandValue instanceof Float) { value = Float.valueOf(((Number)lOperandValue).floatValue() / ((Number)rOperandValue).floatValue()); checkRealNumberOverflow(value, lOperandValue, rOperandValue, expression); } else if (lOperandValue instanceof Long || rOperandValue instanceof Long) { final long r = ((Number)rOperandValue).longValue(); final long l = ((Number)lOperandValue).longValue(); checkDivisionOverflow(l, r, Long.MIN_VALUE, expression); value = r == 0 ? null : Long.valueOf(l / r); } else { final int r = ((Number)rOperandValue).intValue(); final int l = ((Number)lOperandValue).intValue(); checkDivisionOverflow(l, r, Integer.MIN_VALUE, expression); value = r == 0 ? null : Integer.valueOf(l / r); } } } else if (tokenType == JavaTokenType.PERC) { if (lOperandValue instanceof Character) lOperandValue = Integer.valueOf(((Character)lOperandValue).charValue()); if (rOperandValue instanceof Character) rOperandValue = Integer.valueOf(((Character)rOperandValue).charValue()); if (lOperandValue instanceof Number && rOperandValue instanceof Number) { double rVal = ((Number)rOperandValue).doubleValue(); if (myThrowExceptionOnOverflow && rVal == 0) throw new ConstantEvaluationOverflowException(expression); if (lOperandValue instanceof Double || rOperandValue instanceof Double) { value = Double.valueOf(((Number)lOperandValue).doubleValue() % ((Number)rOperandValue).doubleValue()); checkRealNumberOverflow(value, lOperandValue, rOperandValue, expression); } else if (lOperandValue instanceof Float || rOperandValue instanceof Float) { value = Float.valueOf(((Number)lOperandValue).floatValue() % ((Number)rOperandValue).floatValue()); checkRealNumberOverflow(value, lOperandValue, rOperandValue, expression); } else if (lOperandValue instanceof Long || rOperandValue instanceof Long) { final long l = ((Number)lOperandValue).longValue(); final long r = ((Number)rOperandValue).longValue(); checkDivisionOverflow(l, r, Long.MIN_VALUE, expression); value = r == 0 ? null : Long.valueOf(l % r); } else { final int l = ((Number)lOperandValue).intValue(); final int r = ((Number)rOperandValue).intValue(); checkDivisionOverflow(l, r, Integer.MIN_VALUE, expression); value = r == 0 ? null : Integer.valueOf(l % r); } } } else if (tokenType == JavaTokenType.LTLT) { if (lOperandValue instanceof Character) lOperandValue = Integer.valueOf(((Character)lOperandValue).charValue()); if (rOperandValue instanceof Character) rOperandValue = Integer.valueOf(((Character)rOperandValue).charValue()); if (isIntegral(lOperandValue) && isIntegral(rOperandValue)) { if (lOperandValue instanceof Long) { long l = ((Number)lOperandValue).longValue(); long r = ((Number)rOperandValue).longValue(); value = Long.valueOf(l << r); checkMultiplicationOverflow(((Long)value).longValue(), l, (long)Math.pow(2, r & 0x3F), expression); } else { int l = ((Number)lOperandValue).intValue(); int r = ((Number)rOperandValue).intValue(); value = Integer.valueOf(l << r); checkMultiplicationOverflow(((Integer)value).intValue(), l, (long)Math.pow(2, r & 0x1F), expression); } } } else if (tokenType == JavaTokenType.GTGT) { if (lOperandValue instanceof Character) lOperandValue = Integer.valueOf(((Character)lOperandValue).charValue()); if (rOperandValue instanceof Character) rOperandValue = Integer.valueOf(((Character)rOperandValue).charValue()); if (isIntegral(lOperandValue) && isIntegral(rOperandValue)) { if (lOperandValue instanceof Long) { value = Long.valueOf(((Number)lOperandValue).longValue() >> ((Number)rOperandValue).longValue()); } else { value = Integer.valueOf(((Number)lOperandValue).intValue() >> ((Number)rOperandValue).intValue()); } } } else if (tokenType == JavaTokenType.GTGTGT) { if (lOperandValue instanceof Character) lOperandValue = Integer.valueOf(((Character)lOperandValue).charValue()); if (rOperandValue instanceof Character) rOperandValue = Integer.valueOf(((Character)rOperandValue).charValue()); if (isIntegral(lOperandValue) && isIntegral(rOperandValue)) { if (lOperandValue instanceof Long) { value = Long.valueOf(((Number)lOperandValue).longValue() >>> ((Number)rOperandValue).longValue()); } else { value = Integer.valueOf(((Number)lOperandValue).intValue() >>> ((Number)rOperandValue).intValue()); } } } else if (tokenType == JavaTokenType.AND) { if (lOperandValue instanceof Character) lOperandValue = Integer.valueOf(((Character)lOperandValue).charValue()); if (rOperandValue instanceof Character) rOperandValue = Integer.valueOf(((Character)rOperandValue).charValue()); if (isIntegral(lOperandValue) && isIntegral(rOperandValue)) { if (lOperandValue instanceof Long || rOperandValue instanceof Long) { value = Long.valueOf(((Number)lOperandValue).longValue() & ((Number)rOperandValue).longValue()); } else { value = Integer.valueOf(((Number)lOperandValue).intValue() & ((Number)rOperandValue).intValue()); } } else if (lOperandValue instanceof Boolean && rOperandValue instanceof Boolean) { value = Boolean.valueOf(((Boolean)lOperandValue).booleanValue() && ((Boolean)rOperandValue).booleanValue()); } } else if (tokenType == JavaTokenType.OR) { if (lOperandValue instanceof Character) lOperandValue = Integer.valueOf(((Character)lOperandValue).charValue()); if (rOperandValue instanceof Character) rOperandValue = Integer.valueOf(((Character)rOperandValue).charValue()); if (isIntegral(lOperandValue) && isIntegral(rOperandValue)) { if (lOperandValue instanceof Long || rOperandValue instanceof Long) { value = Long.valueOf(((Number)lOperandValue).longValue() | ((Number)rOperandValue).longValue()); } else { value = Integer.valueOf(((Number)lOperandValue).intValue() | ((Number)rOperandValue).intValue()); } } else if (lOperandValue instanceof Boolean && rOperandValue instanceof Boolean) { value = Boolean.valueOf(((Boolean)lOperandValue).booleanValue() || ((Boolean)rOperandValue).booleanValue()); } } else if (tokenType == JavaTokenType.XOR) { if (lOperandValue instanceof Character) lOperandValue = Integer.valueOf(((Character)lOperandValue).charValue()); if (rOperandValue instanceof Character) rOperandValue = Integer.valueOf(((Character)rOperandValue).charValue()); if (isIntegral(lOperandValue) && isIntegral(rOperandValue)) { if (lOperandValue instanceof Long || rOperandValue instanceof Long) { value = Long.valueOf(((Number)lOperandValue).longValue() ^ ((Number)rOperandValue).longValue()); } else { value = Integer.valueOf(((Number)lOperandValue).intValue() ^ ((Number)rOperandValue).intValue()); } } else if (lOperandValue instanceof Boolean && rOperandValue instanceof Boolean) { value = Boolean.valueOf(((Boolean)lOperandValue).booleanValue() ^ ((Boolean)rOperandValue).booleanValue()); } } return value; }