From 62598b023fadd941dcca0f70b65e6cb344bf11e5 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Wed, 14 Mar 2018 15:24:43 +0100 Subject: [PATCH] redundant cast: poly conditional expressions (IDEA-187764) since 1.8 type of the (poly) conditional evaluates based on it's target type, so all checks on it's type are useless, instead check that operands expressions are compatible with the target type --- .../com/intellij/psi/util/RedundantCastUtil.java | 14 +++++++++++++- .../redundantCast/lambda/Conditional.java | 12 ++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) 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