check suspicious ConcurrentHashMap.contains (IDEA-124698)

This commit is contained in:
Anna Kozlova
2014-05-05 13:33:20 +04:00
parent 35206e46bf
commit e4a77b6a34
4 changed files with 30 additions and 3 deletions

View File

@@ -30,8 +30,9 @@ public class SuspiciousMethodCallUtil {
GlobalSearchScope searchScope,
List<PsiMethod> patternMethods,
IntArrayList indices) {
final JavaPsiFacade javaPsiFacade = JavaPsiFacade.getInstance(manager.getProject());
final PsiClass
collectionClass = JavaPsiFacade.getInstance(manager.getProject()).findClass(CommonClassNames.JAVA_UTIL_COLLECTION, searchScope);
collectionClass = javaPsiFacade.findClass(CommonClassNames.JAVA_UTIL_COLLECTION, searchScope);
PsiType[] javaLangObject = {PsiType.getJavaLangObject(manager, searchScope)};
MethodSignature removeSignature = MethodSignatureUtil
.createMethodSignature("remove", javaLangObject, PsiTypeParameter.EMPTY_ARRAY, PsiSubstitutor.EMPTY);
@@ -43,7 +44,7 @@ public class SuspiciousMethodCallUtil {
addMethod(contains, 0, patternMethods, indices);
}
final PsiClass listClass = JavaPsiFacade.getInstance(manager.getProject()).findClass(CommonClassNames.JAVA_UTIL_LIST, searchScope);
final PsiClass listClass = javaPsiFacade.findClass(CommonClassNames.JAVA_UTIL_LIST, searchScope);
if (listClass != null) {
MethodSignature indexofSignature = MethodSignatureUtil.createMethodSignature("indexOf", javaLangObject, PsiTypeParameter.EMPTY_ARRAY, PsiSubstitutor.EMPTY);
PsiMethod indexof = MethodSignatureUtil.findMethodBySignature(listClass, indexofSignature, false);
@@ -53,7 +54,7 @@ public class SuspiciousMethodCallUtil {
addMethod(lastindexof, 0, patternMethods, indices);
}
final PsiClass mapClass = JavaPsiFacade.getInstance(manager.getProject()).findClass(CommonClassNames.JAVA_UTIL_MAP, searchScope);
final PsiClass mapClass = javaPsiFacade.findClass(CommonClassNames.JAVA_UTIL_MAP, searchScope);
if (mapClass != null) {
PsiMethod remove = MethodSignatureUtil.findMethodBySignature(mapClass, removeSignature, false);
addMethod(remove, 0, patternMethods, indices);
@@ -67,6 +68,13 @@ public class SuspiciousMethodCallUtil {
PsiMethod containsValue = MethodSignatureUtil.findMethodBySignature(mapClass, containsValueSignature, false);
addMethod(containsValue, 1, patternMethods, indices);
}
final PsiClass concurrentMapClass = javaPsiFacade.findClass(CommonClassNames.JAVA_UTIL_CONCURRENT_HASH_MAP, searchScope);
if (concurrentMapClass != null) {
MethodSignature containsSignature = MethodSignatureUtil.createMethodSignature("contains", javaLangObject, PsiTypeParameter.EMPTY_ARRAY, PsiSubstitutor.EMPTY);
PsiMethod contains = MethodSignatureUtil.findMethodBySignature(concurrentMapClass, containsSignature, false);
addMethod(contains, 1, patternMethods, indices);
}
}
private static void addMethod(final PsiMethod patternMethod, int typeParamIndex, List<PsiMethod> patternMethods, IntArrayList indices) {

View File

@@ -0,0 +1,9 @@
import java.util.concurrent.ConcurrentHashMap;
class Main<K, V> {
void f(ConcurrentHashMap<K, V> map, K key){
if (map.contains(<warning descr="Suspicious call to 'ConcurrentHashMap.contains'">key</warning>)) {
System.out.println();
}
}
}

View File

@@ -2,7 +2,9 @@ package com.intellij.codeInspection;
import com.intellij.JavaTestUtil;
import com.intellij.codeInspection.miscGenerics.SuspiciousCollectionsMethodCallsInspection;
import com.intellij.testFramework.LightProjectDescriptor;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
import org.jetbrains.annotations.NotNull;
public class SuspiciousCollectionMethodCallsTest extends LightCodeInsightFixtureTestCase {
private final SuspiciousCollectionsMethodCallsInspection myTool = new SuspiciousCollectionsMethodCallsInspection();
@@ -17,10 +19,17 @@ public class SuspiciousCollectionMethodCallsTest extends LightCodeInsightFixture
myFixture.testHighlighting(getTestName(false) + ".java");
}
public void testConcurrentHashMap() throws Exception { doTest(); }
public void testUseDfa() throws Exception { doTest(); }
public void testWildcard() throws Exception { doTest(); }
public void testIgnoreConvertible() throws Exception {
myTool.REPORT_CONVERTIBLE_METHOD_CALLS = false;
doTest();
}
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_8;
}
}

View File

@@ -58,6 +58,7 @@ public interface CommonClassNames {
@NonNls String JAVA_UTIL_MAP = "java.util.Map";
@NonNls String JAVA_UTIL_MAP_ENTRY = "java.util.Map.Entry";
@NonNls String JAVA_UTIL_HASH_MAP = "java.util.HashMap";
@NonNls String JAVA_UTIL_CONCURRENT_HASH_MAP = "java.util.concurrent.ConcurrentHashMap";
@NonNls String JAVA_UTIL_LIST = "java.util.List";
@NonNls String JAVA_UTIL_ARRAY_LIST = "java.util.ArrayList";
@NonNls String JAVA_UTIL_SET = "java.util.Set";