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 318c2bf053a4..9cb2d0426d26 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 @@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil; import com.intellij.psi.infos.MethodCandidateInfo; import com.intellij.psi.tree.IElementType; import com.intellij.util.ArrayUtil; @@ -406,7 +407,18 @@ public class RedundantCastUtil { Comparing.equal(PsiUtil.recaptureWildcards(((PsiCallExpression)newCall).getType(), expression), ((PsiCallExpression)expression).getType())) && newResult.isValidResult() && !(newResult instanceof MethodCandidateInfo && ((MethodCandidateInfo)newResult).getInferenceErrorMessage() != null)) { - if (!(newArgs[i] instanceof PsiFunctionalExpression)) { + PsiExpression newArg = PsiUtil.deparenthesizeExpression(newArgs[i]); + if (newArg instanceof PsiConditionalExpression && PsiPolyExpressionUtil.isPolyExpression(newArgs[i])) { + PsiType targetType = newArg.getType(); + LOG.assertTrue(targetType != null); + //target type is detected by method call + //check that both sides are fine with that + if (targetType.isAssignableFrom(((PsiConditionalExpression)newArg).getThenExpression().getType()) && + targetType.isAssignableFrom(((PsiConditionalExpression)newArg).getElseExpression().getType())) { + addToResults(cast); + } + } + else if (!(newArg instanceof PsiFunctionalExpression)) { addToResults(cast); } else { diff --git a/java/java-tests/testData/inspection/redundantCast/lambda/Conditional.java b/java/java-tests/testData/inspection/redundantCast/lambda/Conditional.java index cfa128ec2f29..29c129e20a4d 100644 --- a/java/java-tests/testData/inspection/redundantCast/lambda/Conditional.java +++ b/java/java-tests/testData/inspection/redundantCast/lambda/Conditional.java @@ -3,3 +3,15 @@ class Test { String kv = (String)(check ? "N" : objectArray[0]) ; } } +class PolyConditional { + + public static void callee(String str) { } + public void usage(Object obj) { + callee((String) (obj != null ? obj : null)); + } + + public static void callee1(String str) { } + public void usage1(Object obj) { + callee1((String) (obj != null ? obj : null)); + } +} \ No newline at end of file