From 48d81d53f0a72518f8e18f30f0ca97f813386c20 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Fri, 6 May 2016 18:42:13 +0200 Subject: [PATCH] suspicious method call: ignore poly conditional expressions in invocation context as their type would be always the same as target type (IDEA-155622) --- .../SuspiciousCollectionsMethodCallsInspection.java | 4 ++-- .../miscGenerics/SuspiciousMethodCallUtil.java | 8 ++++++++ .../redundantCast/RedundantCastInspection.java | 2 +- .../PolyConditionalExpressionPassedToMapGetCall.java | 11 +++++++++++ .../SuspiciousCollectionMethodCallsTest.java | 1 + 5 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/inspection/suspiciousCalls/PolyConditionalExpressionPassedToMapGetCall.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/miscGenerics/SuspiciousCollectionsMethodCallsInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/miscGenerics/SuspiciousCollectionsMethodCallsInspection.java index b5c76d8ba7d5..8726cdfe0190 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/miscGenerics/SuspiciousCollectionsMethodCallsInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/miscGenerics/SuspiciousCollectionsMethodCallsInspection.java @@ -97,11 +97,11 @@ public class SuspiciousCollectionsMethodCallsInspection extends BaseJavaBatchLoc PsiType argType = args[0].getType(); final String plainMessage = SuspiciousMethodCallUtil - .getSuspiciousMethodCallMessage(methodCall, argType, reportConvertibleMethodCalls, patternMethods, indices); + .getSuspiciousMethodCallMessage(methodCall, args[0], argType, reportConvertibleMethodCalls, patternMethods, indices); if (plainMessage != null) { final PsiType dfaType = GuessManager.getInstance(methodCall.getProject()).getControlFlowExpressionType(args[0]); if (dfaType != null && SuspiciousMethodCallUtil - .getSuspiciousMethodCallMessage(methodCall, dfaType, reportConvertibleMethodCalls, patternMethods, indices) == null) { + .getSuspiciousMethodCallMessage(methodCall, args[0], dfaType, reportConvertibleMethodCalls, patternMethods, indices) == null) { return null; } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/miscGenerics/SuspiciousMethodCallUtil.java b/java/java-analysis-impl/src/com/intellij/codeInspection/miscGenerics/SuspiciousMethodCallUtil.java index 9197cf6145e6..18eb9eaf3e44 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/miscGenerics/SuspiciousMethodCallUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/miscGenerics/SuspiciousMethodCallUtil.java @@ -18,6 +18,7 @@ package com.intellij.codeInspection.miscGenerics; import com.intellij.codeInsight.daemon.impl.analysis.JavaGenericsUtil; import com.intellij.codeInspection.InspectionsBundle; import com.intellij.psi.*; +import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.*; import com.intellij.util.containers.IntArrayList; @@ -104,6 +105,7 @@ public class SuspiciousMethodCallUtil { @Nullable public static String getSuspiciousMethodCallMessage(@NotNull PsiMethodCallExpression methodCall, + PsiExpression arg, PsiType argType, boolean reportConvertibleMethodCalls, @NotNull List patternMethods, @@ -117,6 +119,12 @@ public class SuspiciousMethodCallUtil { if (argType == null) return null; + if (arg instanceof PsiConditionalExpression && + PsiPolyExpressionUtil.isPolyExpression(arg) && + argType.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) { + return null; + } + final JavaResolveResult resolveResult = methodExpression.advancedResolve(false); PsiMethod calleeMethod = (PsiMethod)resolveResult.getElement(); if (calleeMethod == null) return null; diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/redundantCast/RedundantCastInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/redundantCast/RedundantCastInspection.java index 2e4e80599c1b..36f60dbcb178 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/redundantCast/RedundantCastInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/redundantCast/RedundantCastInspection.java @@ -116,7 +116,7 @@ public class RedundantCastInspection extends GenericsInspectionToolBase { final PsiElement gParent = parent.getParent(); if (gParent instanceof PsiMethodCallExpression && IGNORE_SUSPICIOUS_METHOD_CALLS) { final String message = SuspiciousMethodCallUtil - .getSuspiciousMethodCallMessage((PsiMethodCallExpression)gParent, operand.getType(), true, new ArrayList(), + .getSuspiciousMethodCallMessage((PsiMethodCallExpression)gParent, operand, operand.getType(), true, new ArrayList(), new IntArrayList()); if (message != null) { return null; diff --git a/java/java-tests/testData/inspection/suspiciousCalls/PolyConditionalExpressionPassedToMapGetCall.java b/java/java-tests/testData/inspection/suspiciousCalls/PolyConditionalExpressionPassedToMapGetCall.java new file mode 100644 index 000000000000..5ccf9c6a8d78 --- /dev/null +++ b/java/java-tests/testData/inspection/suspiciousCalls/PolyConditionalExpressionPassedToMapGetCall.java @@ -0,0 +1,11 @@ + +import java.util.List; +import java.util.Map; + +class Test { + + void m(Map map) { + map.get(map.size() > 10 ? Map.class : List.class); + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/SuspiciousCollectionMethodCallsTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/SuspiciousCollectionMethodCallsTest.java index 58c96b5562a1..8619792bb631 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/SuspiciousCollectionMethodCallsTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/SuspiciousCollectionMethodCallsTest.java @@ -24,6 +24,7 @@ public class SuspiciousCollectionMethodCallsTest extends LightCodeInsightFixture public void testSetList() throws Exception { doTest(); } public void testUseDfa() throws Exception { doTest(); } public void testWildcard() throws Exception { doTest(); } + public void testPolyConditionalExpressionPassedToMapGetCall() throws Exception { doTest(); } public void testIgnoreConvertible() throws Exception { myTool.REPORT_CONVERTIBLE_METHOD_CALLS = false; doTest();