From 68ee1047f80e8ffb4bb883d4572757036b4099fe Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 18 May 2015 13:04:33 +0200 Subject: [PATCH] abstract overrides abstract: ignore if also overrides default and resolves ambiguity (IDEA-140376) --- ...MethodOverridesAbstractMethodInspection.java | 12 +++++++++--- .../AbstractMethodOverridesAbstractMethod.java | 17 +++++++++++++++++ ...odOverridesAbstractMethodInspectionTest.java | 11 +++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspection.java index 1ab70368e8c7..137374f12006 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspection.java @@ -115,22 +115,28 @@ public class AbstractMethodOverridesAbstractMethodInspection extends BaseInspect if (!method.hasModifierProperty(PsiModifier.ABSTRACT) && !containingClass.isInterface()) { return; } + boolean overrideDefault = false; + boolean accept = false; final PsiMethod[] superMethods = method.findSuperMethods(); for (final PsiMethod superMethod : superMethods) { + overrideDefault |= superMethod.hasModifierProperty(PsiModifier.DEFAULT); if (!isAbstract(superMethod)) { continue; } - if (!methodsHaveSameReturnTypes(method, superMethod) || !haveSameExceptionSignatures(method, superMethod)) { - continue; + if (overrideDefault) { + return; } + accept |= methodsHaveSameReturnTypes(method, superMethod) && haveSameExceptionSignatures(method, superMethod); + if (ignoreJavaDoc && !haveSameJavaDoc(method, superMethod)) { return; } if (ignoreAnnotations && !methodsHaveSameAnnotations(method, superMethod)) { return; } + } + if (accept && !overrideDefault) { registerMethodError(method); - return; } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/abstract_method_overrides_abstract_method/AbstractMethodOverridesAbstractMethod.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/abstract_method_overrides_abstract_method/AbstractMethodOverridesAbstractMethod.java index 5cb023abb49f..2823bd71b25d 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/abstract_method_overrides_abstract_method/AbstractMethodOverridesAbstractMethod.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/abstract_method_overrides_abstract_method/AbstractMethodOverridesAbstractMethod.java @@ -62,6 +62,23 @@ class SuperclassSubst { } class Java8DefaultMethods { + + interface A { + String method(); + } + + interface B { + default String method() { + return null; + } + } + + //without override would inherit abstract & default - red code + interface C extends A, B { + @Override + String method(); + } + interface Super { default void method() diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspectionTest.java index 5e6ed0b25c88..753c2f76f53a 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspectionTest.java @@ -1,5 +1,9 @@ package com.siyeh.ig.inheritance; +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 AbstractMethodOverridesAbstractMethodInspectionTest extends IGInspectionTestCase { @@ -10,4 +14,11 @@ public class AbstractMethodOverridesAbstractMethodInspectionTest extends IGInspe tool.ignoreJavaDoc = true; doTest("com/siyeh/igtest/inheritance/abstract_method_overrides_abstract_method", tool); } + + @Override + protected Sdk getTestProjectSdk() { + Sdk sdk = IdeaTestUtil.getMockJdk17(); + LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.HIGHEST); + return sdk; + } }