diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/ExtendsConcreteCollectionInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/ExtendsConcreteCollectionInspectionBase.java index 5a9f275c606a..efbcb05bd62c 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/ExtendsConcreteCollectionInspectionBase.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/ExtendsConcreteCollectionInspectionBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * 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. @@ -15,12 +15,12 @@ */ package com.siyeh.ig.inheritance; -import com.intellij.psi.PsiAnonymousClass; -import com.intellij.psi.PsiClass; +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 com.siyeh.ig.psiutils.TypeUtils; import org.jetbrains.annotations.NotNull; public class ExtendsConcreteCollectionInspectionBase extends BaseInspection { @@ -68,6 +68,24 @@ public class ExtendsConcreteCollectionInspectionBase extends BaseInspection { if (!CollectionUtils.isCollectionClass(superClass)) { return; } + final String qualifiedName = superClass.getQualifiedName(); + if ("java.util.LinkedHashMap".equals(qualifiedName)) { + final PsiMethod[] methods = aClass.findMethodsByName("removeEldestEntry", false); + final PsiClassType entryType = TypeUtils.getType("java.util.Map.Entry", aClass); + for (PsiMethod method : methods) { + if (!PsiType.BOOLEAN.equals(method.getReturnType())) { + continue; + } + final PsiParameterList parameterList = method.getParameterList(); + if ( parameterList.getParametersCount() != 1) { + continue; + } + final PsiParameter parameter = parameterList.getParameters()[0]; + if (entryType.isAssignableFrom(parameter.getType())) { + return; + } + } + } registerClassError(aClass, superClass, aClass); } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/extends_concrete_collection/ExtendsConcreteCollection.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/extends_concrete_collection/ExtendsConcreteCollection.java new file mode 100644 index 000000000000..959c0f3bc89f --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/extends_concrete_collection/ExtendsConcreteCollection.java @@ -0,0 +1,15 @@ +package com.siyeh.igtest.inheritance.extends_concrete_collection; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.Map; + +class ExtendsConcreteCollection extends ArrayList { + +} +class MyMap extends LinkedHashMap { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return true; + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/ExtendsConcreteCollectionInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/ExtendsConcreteCollectionInspectionTest.java new file mode 100644 index 000000000000..99c6a2480928 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/ExtendsConcreteCollectionInspectionTest.java @@ -0,0 +1,49 @@ +/* + * 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.inheritance; + +import com.intellij.codeInspection.InspectionProfileEntry; +import com.siyeh.ig.LightInspectionTestCase; + +/** + * @author Bas Leijdekkers + */ +public class ExtendsConcreteCollectionInspectionTest extends LightInspectionTestCase { + @Override + protected InspectionProfileEntry getInspection() { + return new ExtendsConcreteCollectionInspection(); + } + + @Override + protected String[] getEnvironmentClasses() { + return new String[] { + "package java.util;" + + "public class LinkedHashMap {" + + " protected boolean removeEldestEntry(Map.Entry eldest) {\n" + + " return false;\n" + + " }" + + "}", + "package java.util;" + + "public class ArrayDeque extends AbstractCollection {" + + " public Iterator iterator() { return null; }" + + " public int size() { return 0; }" + + "}" + }; + } + + public void testExtendsConcreteCollection() { doTest(); } + +}