diff --git a/java/java-analysis-impl/src/com/intellij/psi/util/RedundantCastUtil.java b/java/java-analysis-impl/src/com/intellij/psi/util/RedundantCastUtil.java index fcdcce8795c3..669b9fda60c0 100644 --- a/java/java-analysis-impl/src/com/intellij/psi/util/RedundantCastUtil.java +++ b/java/java-analysis-impl/src/com/intellij/psi/util/RedundantCastUtil.java @@ -343,11 +343,11 @@ public class RedundantCastUtil { if (newThenExpression instanceof PsiTypeCastExpression && !castForBoxing(getInnerMostOperand(thenExpression), elseExpression != null ? elseExpression.getType() : null, conditionalType)) { - checkConditionalBranch(expression, newCall, oldMethod, thenExpression, newThenExpression); + checkConditionalBranch(expression, newCall, thenExpression, newThenExpression); } if (newElseExpression instanceof PsiTypeCastExpression && !castForBoxing(getInnerMostOperand(elseExpression), thenExpression != null ? thenExpression.getType() : null, conditionalType)) { - checkConditionalBranch(expression, newCall, oldMethod, elseExpression, newElseExpression); + checkConditionalBranch(expression, newCall, elseExpression, newElseExpression); } } } @@ -355,15 +355,15 @@ public class RedundantCastUtil { private void checkConditionalBranch(PsiCall oldCall, PsiCall newCall, - PsiMethod oldMethod, PsiExpression oldBranchExpression, PsiExpression newBranchExpression) { PsiExpression operand = ((PsiTypeCastExpression)newBranchExpression).getOperand(); if (operand != null) { newBranchExpression = (PsiExpression)newBranchExpression.replace(operand); + JavaResolveResult oldResult = oldCall.resolveMethodGenerics(); JavaResolveResult newResult = resolveNewResult(oldCall, newCall); - if (newResult.getElement() == oldMethod && - newResult.isValidResult()) { + + if (isSameResolveResult(oldResult, newResult)) { addToResults((PsiTypeCastExpression)oldBranchExpression); } else { @@ -372,6 +372,15 @@ public class RedundantCastUtil { } } + private static boolean isSameResolveResult(JavaResolveResult oldResult, JavaResolveResult newResult) { + PsiMethod oldMethod = (PsiMethod)oldResult.getElement(); + LOG.assertTrue(oldMethod != null); + return oldMethod.equals(newResult.getElement()) && + newResult.isValidResult() && + !(newResult instanceof MethodCandidateInfo && ((MethodCandidateInfo)newResult).getInferenceErrorMessage() != null) && + recapture(newResult.getSubstitutor()).equals(oldResult.getSubstitutor()); + } + private static boolean castForBoxing(PsiExpression operand, PsiType oppositeType, PsiType conditionalType) { return operand != null && TypeConversionUtil.isPrimitiveAndNotNull(operand.getType()) && @@ -476,10 +485,7 @@ public class RedundantCastUtil { return; } - if (oldMethod.equals(newResult.getElement()) && - newResult.isValidResult() && - !(newResult instanceof MethodCandidateInfo && ((MethodCandidateInfo)newResult).getInferenceErrorMessage() != null) && - recapture(newResult.getSubstitutor()).equals(oldResult.getSubstitutor())) { + if (isSameResolveResult(oldResult, newResult)) { PsiExpression newArg = PsiUtil.deparenthesizeExpression(newArgs[i]); if (newArg instanceof PsiFunctionalExpression) { PsiType newArgType = calculateNewArgType(i, newResult, parameters); diff --git a/java/java-tests/testData/inspection/redundantCast/lambda/SameResolveWithConditionalBranches.java b/java/java-tests/testData/inspection/redundantCast/lambda/SameResolveWithConditionalBranches.java new file mode 100644 index 000000000000..b17330c03377 --- /dev/null +++ b/java/java-tests/testData/inspection/redundantCast/lambda/SameResolveWithConditionalBranches.java @@ -0,0 +1,10 @@ +class Cond { + static Cond create(A a, B b) { + return null; + } + + void m(boolean a, Object o){ + Cond c = Cond.create(a ? (String)o : null, ""); + Cond c1 = Cond.create(a ? (String)o : "null", a ? (String)o : "null"); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast18Test.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast18Test.java index 11be07af8e24..20512e74cfd6 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast18Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast18Test.java @@ -53,4 +53,5 @@ public class RedundantCast18Test extends LightDaemonAnalyzerTestCase { public void testMiscStatements() { doTest();} public void testSameSubstitutor() { doTest();} public void testSameUpperBounds() { doTest();} + public void testSameResolveWithConditionalBranches() { doTest();} } \ No newline at end of file