From a2dd182fb633e3ad4263423164a8a28d8b5d22bb Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 6 Feb 2014 12:06:53 +0100 Subject: [PATCH] move utility method to it's only usage and add test --- ...ionsMustHaveInitialCapacityInspection.java | 57 +++++++++++++------ .../siyeh/ig/psiutils/CollectionUtils.java | 35 ------------ ...MustHaveInitialCapacityInspectionTest.java | 41 +++++++++++++ 3 files changed, 82 insertions(+), 51 deletions(-) create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/performance/CollectionsMustHaveInitialCapacityInspectionTest.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/performance/CollectionsMustHaveInitialCapacityInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/performance/CollectionsMustHaveInitialCapacityInspection.java index 0010383f99a5..5a0362616977 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/performance/CollectionsMustHaveInitialCapacityInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/performance/CollectionsMustHaveInitialCapacityInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2014 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,19 +15,39 @@ */ package com.siyeh.ig.performance; -import com.intellij.psi.PsiExpression; -import com.intellij.psi.PsiExpressionList; -import com.intellij.psi.PsiNewExpression; -import com.intellij.psi.PsiType; +import com.intellij.psi.*; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.CollectionUtils; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashSet; +import java.util.Set; public class CollectionsMustHaveInitialCapacityInspection extends BaseInspection { + @NonNls + private static final Set collectionClassesRequiringCapacity = new HashSet(); + static { + collectionClassesRequiringCapacity.add("java.util.concurrent.ConcurrentHashMap"); + collectionClassesRequiringCapacity.add("java.util.concurrent.PriorityBlockingQueue"); + collectionClassesRequiringCapacity.add("java.util.ArrayDeque"); + collectionClassesRequiringCapacity.add("java.util.ArrayList"); + collectionClassesRequiringCapacity.add("java.util.BitSet"); + collectionClassesRequiringCapacity.add("java.util.HashMap"); + collectionClassesRequiringCapacity.add("java.util.Hashtable"); + collectionClassesRequiringCapacity.add("java.util.HashSet"); + collectionClassesRequiringCapacity.add("java.util.IdentityHashMap"); + collectionClassesRequiringCapacity.add("java.util.LinkedHashMap"); + collectionClassesRequiringCapacity.add("java.util.LinkedHashSet"); + collectionClassesRequiringCapacity.add("java.util.PriorityQueue"); + collectionClassesRequiringCapacity.add("java.util.Vector"); + collectionClassesRequiringCapacity.add("java.util.WeakHashMap"); + } + @Override @NotNull public String getID() { @@ -60,22 +80,27 @@ public class CollectionsMustHaveInitialCapacityInspection public void visitNewExpression(@NotNull PsiNewExpression expression) { super.visitNewExpression(expression); final PsiType type = expression.getType(); - - if (type == null) { - return; - } - if (!CollectionUtils.isCollectionWithInitialCapacity(type)) { + if (!isCollectionWithInitialCapacity(type)) { return; } final PsiExpressionList argumentList = expression.getArgumentList(); - if (argumentList == null) { + if (argumentList == null || argumentList.getExpressions().length != 0) { return; } - final PsiExpression[] parameters = argumentList.getExpressions(); - if (parameters.length != 0) { - return; + registerNewExpressionError(expression); + } + + public static boolean isCollectionWithInitialCapacity(@Nullable PsiType type) { + if (!(type instanceof PsiClassType)) { + return false; } - registerError(expression); + final PsiClassType classType = (PsiClassType)type; + final PsiClass resolved = classType.resolve(); + if (resolved == null) { + return false; + } + final String className = resolved.getQualifiedName(); + return collectionClassesRequiringCapacity.contains(className); } } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/CollectionUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/CollectionUtils.java index 1ed99bd7e6cb..6964a6d34c51 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/CollectionUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/CollectionUtils.java @@ -29,11 +29,6 @@ import java.util.Set; public class CollectionUtils { - /** - * @noinspection StaticCollection - */ - @NonNls private static final Set s_collectionClassesRequiringCapacity = - new HashSet(); /** * @noinspection StaticCollection */ @@ -46,22 +41,6 @@ public class CollectionUtils { new HashMap(); static { - s_collectionClassesRequiringCapacity.add("java.util.BitSet"); - s_collectionClassesRequiringCapacity.add("java.util.Vector"); - s_collectionClassesRequiringCapacity.add("java.util.ArrayList"); - s_collectionClassesRequiringCapacity.add("java.util.HashMap"); - s_collectionClassesRequiringCapacity.add("java.util.LinkedHashMap"); - s_collectionClassesRequiringCapacity.add("java.util.WeakHashMap"); - s_collectionClassesRequiringCapacity.add("java.util.Hashtable"); - s_collectionClassesRequiringCapacity.add("java.util.HashSet"); - s_collectionClassesRequiringCapacity.add("java.util.LinkedHashSet"); - s_collectionClassesRequiringCapacity.add("com.sun.java.util.collections.BitSet"); - s_collectionClassesRequiringCapacity.add("com.sun.java.util.collections.Vector"); - s_collectionClassesRequiringCapacity.add("com.sun.java.util.collections.ArrayList"); - s_collectionClassesRequiringCapacity.add("com.sun.java.util.collections.HashMap"); - s_collectionClassesRequiringCapacity.add("com.sun.java.util.collections.Hashtable"); - s_collectionClassesRequiringCapacity.add("com.sun.java.util.collections.HashSet"); - s_allCollectionClassesAndInterfaces.add("java.util.AbstractCollection"); s_allCollectionClassesAndInterfaces.add("java.util.AbstractList"); s_allCollectionClassesAndInterfaces.add("java.util.AbstractMap"); @@ -148,20 +127,6 @@ public class CollectionUtils { super(); } - public static boolean isCollectionWithInitialCapacity( - @Nullable PsiType type) { - if (!(type instanceof PsiClassType)) { - return false; - } - final PsiClassType classType = (PsiClassType)type; - final PsiClass resolved = classType.resolve(); - if (resolved == null) { - return false; - } - final String className = resolved.getQualifiedName(); - return s_collectionClassesRequiringCapacity.contains(className); - } - @Contract("null -> false") public static boolean isConcreteCollectionClass(@Nullable PsiType type) { if (!(type instanceof PsiClassType)) { diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/performance/CollectionsMustHaveInitialCapacityInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/performance/CollectionsMustHaveInitialCapacityInspectionTest.java new file mode 100644 index 000000000000..256456a1e785 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/performance/CollectionsMustHaveInitialCapacityInspectionTest.java @@ -0,0 +1,41 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.siyeh.ig.performance; + +import com.intellij.codeInspection.InspectionProfileEntry; +import com.siyeh.ig.LightInspectionTestCase; + +/** + * @author Bas Leijdekkers + */ +public class CollectionsMustHaveInitialCapacityInspectionTest extends LightInspectionTestCase { + @Override + protected InspectionProfileEntry getInspection() { + return new CollectionsMustHaveInitialCapacityInspection(); + } + + @Override + protected String[] getEnvironmentClasses() { + return new String[] { + "package java.util.concurrent;" + + "public class ConcurrentHashMap {}" + }; + } + + public void testSimple() { + doStatementTest("new /*'java.util.concurrent.ConcurrentHashMap' without initial capacity*/java.util.concurrent.ConcurrentHashMap/**/();"); + } +}