diff --git a/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java b/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java index 04c72af9a1a9..eca6dc4888f8 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java @@ -592,6 +592,18 @@ public class RedundantCastUtil { if (!isCastRedundantInRefExpression(refExpression, operand)) return; } } + if (parent instanceof PsiConditionalExpression) { + if (castTo instanceof PsiClassType && opType instanceof PsiPrimitiveType && opType != PsiType.NULL) { + final PsiExpression thenExpression = ((PsiConditionalExpression)parent).getThenExpression(); + final PsiExpression elseExpression = ((PsiConditionalExpression)parent).getElseExpression(); + final PsiExpression opposite = PsiTreeUtil.isAncestor(thenExpression, typeCast, false) ? elseExpression : thenExpression; + if (opposite != null && + !(opposite.getType() instanceof PsiPrimitiveType) && + !(PsiTypesUtil.getExpectedTypeByParent((PsiExpression)parent) instanceof PsiPrimitiveType)) { + return; + } + } + } if (arrayAccessAtTheLeftSideOfAssignment(parent)) { if (TypeConversionUtil.isAssignable(opType, castTo, false) && opType.getArrayDimensions() == castTo.getArrayDimensions()) { diff --git a/java/java-tests/testData/inspection/redundantCast/generics/BoxingInConditional/expected.xml b/java/java-tests/testData/inspection/redundantCast/generics/BoxingInConditional/expected.xml index 3bf1252e596b..edc206d502cd 100644 --- a/java/java-tests/testData/inspection/redundantCast/generics/BoxingInConditional/expected.xml +++ b/java/java-tests/testData/inspection/redundantCast/generics/BoxingInConditional/expected.xml @@ -6,4 +6,11 @@ Redundant type cast Casting <code>2</code> to <code>Integer</code> is redundant + + Test.java + 18 + Redundant type cast + Casting <code>1</code> to <code>Integer</code> is redundant + + diff --git a/java/java-tests/testData/inspection/redundantCast/generics/BoxingInConditional/src/Test.java b/java/java-tests/testData/inspection/redundantCast/generics/BoxingInConditional/src/Test.java index 995072a79416..7962c90b303b 100644 --- a/java/java-tests/testData/inspection/redundantCast/generics/BoxingInConditional/src/Test.java +++ b/java/java-tests/testData/inspection/redundantCast/generics/BoxingInConditional/src/Test.java @@ -7,4 +7,16 @@ public class Test { private int foo1(String s, Integer i) { return s == null ? i : (Integer)2; } +} + +class RedundantCastTest { + + public static void main(String[] args) { + Integer foo = 5; + Integer bar = null; + print(args == null || args.length == 0 ? bar : (Integer) 1); + int i = args == null || args.length == 0 ? bar : (Integer) 1; + } + + private static void print(Integer i) {} } \ No newline at end of file