From fb0978061cf488ab5f77e27b809b71fc00b9a2be Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 24 Mar 2014 21:11:08 +0100 Subject: [PATCH] IDEA-122661 "Method overloads method of superclass" inspection missing default methods in Java 8 interfaces --- ...odOverloadsParentMethodInspectionBase.java | 40 ++++++++++++++----- .../MethodOverloadsParentMethod.java | 21 ++++++++++ .../expected.xml | 7 ++++ ...odOverloadsParentMethodInspectionTest.java | 12 ++++++ 4 files changed, 70 insertions(+), 10 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/visibility/MethodOverloadsParentMethodInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/visibility/MethodOverloadsParentMethodInspectionBase.java index 035593653df8..2795f75e6b8b 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/visibility/MethodOverloadsParentMethodInspectionBase.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/visibility/MethodOverloadsParentMethodInspectionBase.java @@ -17,6 +17,7 @@ package com.siyeh.ig.visibility; import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; import com.intellij.psi.*; +import com.intellij.psi.util.PsiUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; @@ -85,18 +86,36 @@ public class MethodOverloadsParentMethodInspectionBase extends BaseInspection { if (MethodUtils.hasSuper(method)) { return; } - PsiClass ancestorClass = aClass.getSuperClass(); final Set visitedClasses = new HashSet(); - while (ancestorClass != null) { - if (!visitedClasses.add(ancestorClass)) { - return; - } - if (methodOverloads(method, ancestorClass)) { - registerMethodError(method); - return; - } - ancestorClass = ancestorClass.getSuperClass(); + processSupers(method, aClass, aClass, visitedClasses); + } + + private boolean processSupers(final PsiMethod method, + final PsiClass psiClass, + final PsiClass initialClass, + final Set visitedClasses) { + if (!visitedClasses.add(psiClass)) { + return false; } + if (initialClass != psiClass && methodOverloads(method, psiClass)) { + registerMethodError(method); + return true; + } + else { + if (PsiUtil.isLanguageLevel8OrHigher(method)) { + for (PsiClass superClass : psiClass.getSupers()) { + if (processSupers(method, superClass, initialClass, visitedClasses)) { + return true; + } + } + } else { + final PsiClass superClass = psiClass.getSuperClass(); + if (superClass != null) { + return processSupers(method, superClass, initialClass, visitedClasses); + } + } + } + return false; } private boolean methodOverloads(PsiMethod method, PsiClass ancestorClass) { @@ -107,6 +126,7 @@ public class MethodOverloadsParentMethodInspectionBase extends BaseInspection { for (final PsiMethod testMethod : methods) { if (!testMethod.hasModifierProperty(PsiModifier.PRIVATE) && !testMethod.hasModifierProperty(PsiModifier.STATIC) && + !testMethod.hasModifierProperty(PsiModifier.ABSTRACT) && !isOverriddenInClass(testMethod, method.getContainingClass())) { final PsiParameterList testParameterList = testMethod.getParameterList(); final PsiParameter[] testParameters = testParameterList.getParameters(); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/visibility/method_overloads_parent_method/MethodOverloadsParentMethod.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/visibility/method_overloads_parent_method/MethodOverloadsParentMethod.java index 591f38d06ec4..47d8474f874f 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/visibility/method_overloads_parent_method/MethodOverloadsParentMethod.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/visibility/method_overloads_parent_method/MethodOverloadsParentMethod.java @@ -24,4 +24,25 @@ class Parent { Object bla(double d) { return null; } +} + +class DefaultMethod { + public static interface IFoo { + default void foo(int i) { + System.out.println("IFoo.foo(int): " + i); + } + + void bar(int i); + + } + + public static class Foo implements IFoo { + public void foo(long l) { + System.out.println("Foo.foo(long): " + l); + } + + public void bar(long l) { + System.out.println("Foo.bar(long): " + l); + } + } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/visibility/method_overloads_parent_method/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/visibility/method_overloads_parent_method/expected.xml index 5d8ab8b7374e..b5d00fce9a41 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/visibility/method_overloads_parent_method/expected.xml +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/visibility/method_overloads_parent_method/expected.xml @@ -21,4 +21,11 @@ Method overloads method of superclass Method <code>bla()</code> overloads a compatible method of a superclass, when overriding might have been intended #loc + + + MethodOverloadsParentMethod.java + 40 + Method overloads method of superclass + Method <code>foo()</code> overloads a compatible method of a superclass, when overriding might have been intended #loc + \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/visibility/MethodOverloadsParentMethodInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/visibility/MethodOverloadsParentMethodInspectionTest.java index 440e7cf993f0..0fe9f5d4c1c1 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/visibility/MethodOverloadsParentMethodInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/visibility/MethodOverloadsParentMethodInspectionTest.java @@ -1,5 +1,9 @@ package com.siyeh.ig.visibility; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.roots.LanguageLevelProjectExtension; +import com.intellij.pom.java.LanguageLevel; +import com.intellij.testFramework.IdeaTestUtil; import com.siyeh.ig.IGInspectionTestCase; public class MethodOverloadsParentMethodInspectionTest extends IGInspectionTestCase { @@ -7,4 +11,12 @@ public class MethodOverloadsParentMethodInspectionTest extends IGInspectionTestC public void test() throws Exception { doTest("com/siyeh/igtest/visibility/method_overloads_parent_method", new MethodOverloadsParentMethodInspection()); } + + @Override + protected Sdk getTestProjectSdk() { + final Sdk sdk = IdeaTestUtil.getMockJdk17(); + LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.HIGHEST); + return sdk; + } + } \ No newline at end of file