From 6b5c924a4efb248a3758500eee813e02e6be1041 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Sat, 31 May 2014 15:57:01 +0400 Subject: [PATCH] suspicious collections call: process removeAll (IDEA-108755) --- .../SuspiciousMethodCallUtil.java | 25 +++++++++++++++++++ .../suspiciousCalls/RemoveAllCall.java | 16 ++++++++++++ .../SuspiciousCollectionMethodCallsTest.java | 1 + 3 files changed, 42 insertions(+) create mode 100644 java/java-tests/testData/inspection/suspiciousCalls/RemoveAllCall.java 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 3f8b5feed2be..41111cba76fe 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 @@ -15,11 +15,14 @@ */ 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.PsiImplUtil; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.*; import com.intellij.util.containers.IntArrayList; +import com.sun.corba.se.impl.corba.TCUtility; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -39,9 +42,15 @@ public class SuspiciousMethodCallUtil { if (collectionClass != null) { PsiMethod remove = MethodSignatureUtil.findMethodBySignature(collectionClass, removeSignature, false); addMethod(remove, 0, patternMethods, indices); + MethodSignature containsSignature = MethodSignatureUtil.createMethodSignature("contains", javaLangObject, PsiTypeParameter.EMPTY_ARRAY, PsiSubstitutor.EMPTY); PsiMethod contains = MethodSignatureUtil.findMethodBySignature(collectionClass, containsSignature, false); addMethod(contains, 0, patternMethods, indices); + + PsiClassType wildcardCollection = javaPsiFacade.getElementFactory().createType(collectionClass, PsiWildcardType.createUnbounded(manager)); + MethodSignature removeAllSignature = MethodSignatureUtil.createMethodSignature("removeAll", new PsiType[] {wildcardCollection}, PsiTypeParameter.EMPTY_ARRAY, PsiSubstitutor.EMPTY); + PsiMethod removeAll = MethodSignatureUtil.findMethodBySignature(collectionClass, removeAllSignature, false); + addMethod(removeAll, 0, patternMethods, indices); } final PsiClass listClass = javaPsiFacade.findClass(CommonClassNames.JAVA_UTIL_LIST, searchScope); @@ -143,6 +152,22 @@ public class SuspiciousMethodCallUtil { final PsiTypeParameter typeParameter = typeParameters[index]; PsiType typeParamMapping = substitutor.substitute(typeParameter); if (typeParamMapping == null) return null; + + PsiParameter[] parameters = patternMethod.getParameterList().getParameters(); + if (parameters.length == 1 && "removeAll".equals(patternMethod.getName())) { + PsiType paramType = parameters[0].getType(); + if (InheritanceUtil.isInheritor(paramType, CommonClassNames.JAVA_UTIL_COLLECTION)) { + PsiType qualifierType = qualifier.getType(); + if (qualifierType != null && !qualifierType.isAssignableFrom(argType)) { + final PsiType itemType = JavaGenericsUtil.getCollectionItemType(argType, calleeMethod.getResolveScope()); + return InspectionsBundle.message("inspection.suspicious.collections.method.calls.problem.descriptor", + PsiFormatUtil.formatType(qualifierType, 0, PsiSubstitutor.EMPTY), + PsiFormatUtil.formatType(itemType, 0, PsiSubstitutor.EMPTY)); + } + return null; + } + } + String message = null; if (typeParamMapping instanceof PsiCapturedWildcardType) { typeParamMapping = ((PsiCapturedWildcardType)typeParamMapping).getWildcard(); diff --git a/java/java-tests/testData/inspection/suspiciousCalls/RemoveAllCall.java b/java/java-tests/testData/inspection/suspiciousCalls/RemoveAllCall.java new file mode 100644 index 000000000000..7c839c0eb121 --- /dev/null +++ b/java/java-tests/testData/inspection/suspiciousCalls/RemoveAllCall.java @@ -0,0 +1,16 @@ +import java.util.*; + + +class Simple { + public static void main(String[] args) { + class O {} + + Map someData = new HashMap(); + Set set = new HashSet(); + Set setO = new HashSet(); + + set.removeAll(someData.keySet()); + setO.removeAll(someData.keySet()); + + } +} \ 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 cd966088d6e3..404219c5d067 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/SuspiciousCollectionMethodCallsTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/SuspiciousCollectionMethodCallsTest.java @@ -20,6 +20,7 @@ public class SuspiciousCollectionMethodCallsTest extends LightCodeInsightFixture } public void testConcurrentHashMap() throws Exception { doTest(); } + public void testRemoveAllCall() throws Exception { doTest(); } public void testUseDfa() throws Exception { doTest(); } public void testWildcard() throws Exception { doTest(); } public void testIgnoreConvertible() throws Exception {