diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java index e6124f8cfcd6..7a9fc0d0441e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java @@ -477,6 +477,49 @@ public class GenericsHighlightUtil { if (info != null) return info; } + final PsiIdentifier classIdentifier = aClass.getNameIdentifier(); + if (PsiUtil.isLanguageLevel8OrHigher(aClass) && classIdentifier != null) { + final HighlightInfo info = checkUnrelatedDefaultMethods(aClass, signaturesWithSupers, classIdentifier); + if (info != null) return info; + } + + return null; + } + + private static HighlightInfo checkUnrelatedDefaultMethods(PsiClass aClass, + Collection signaturesWithSupers, + PsiIdentifier classIdentifier) { + for (HierarchicalMethodSignature methodSignature : signaturesWithSupers) { + final PsiMethod method = methodSignature.getMethod(); + if (method.hasModifierProperty(PsiModifier.DEFAULT)) { + final PsiClass containingClass = method.getContainingClass(); + List superSignatures = methodSignature.getSuperSignatures(); + if (!superSignatures.isEmpty()) { + for (HierarchicalMethodSignature signature : superSignatures) { + final PsiMethod superMethod = signature.getMethod(); + final PsiClass superContainingClass = superMethod.getContainingClass(); + if (containingClass != null && superContainingClass != null && !InheritanceUtil + .isInheritorOrSelf(containingClass, superContainingClass, true)) { + if (superMethod.hasModifierProperty(PsiModifier.DEFAULT)) { + final String inheritUnrelatedDefaultsMessage = HighlightUtil.formatClass(aClass) + " inherits unrelated defaults for " + + HighlightUtil.formatMethod(method) + " from types " + HighlightUtil.formatClass(containingClass) + + " and " + HighlightUtil.formatClass(superContainingClass); + return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, + classIdentifier, inheritUnrelatedDefaultsMessage); + } + if (!aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + final String message = JavaErrorMessages.message( + aClass instanceof PsiEnumConstantInitializer ? "enum.constant.should.implement.method" : "class.must.be.abstract", + HighlightUtil.formatClass(superContainingClass), + HighlightUtil.formatMethod(superMethod), + HighlightUtil.formatClass(superContainingClass, false)); + return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, classIdentifier, message); + } + } + } + } + } + } return null; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/InheritUnrelatedDefaults.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/InheritUnrelatedDefaults.java new file mode 100644 index 000000000000..bbcf8b47d745 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/InheritUnrelatedDefaults.java @@ -0,0 +1,3 @@ +interface B { default void foo() {} } +interface C { default void foo() {} } +class D implements B, C {} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/NotInheritFromUnrelatedDefault.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/NotInheritFromUnrelatedDefault.java new file mode 100644 index 000000000000..cfc1ee7abec4 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/NotInheritFromUnrelatedDefault.java @@ -0,0 +1,15 @@ +interface FirstParent { + + default int doSomething() { + return 1; + } +} + +interface SecondParent { + + int doSomething(); +} + +class FirstSon implements FirstParent, SecondParent {} + +class SecondSon implements SecondParent, FirstParent {} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java index 9b72a23757f7..743e6db5e951 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java @@ -159,6 +159,8 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase { public void testUncheckedWarningIDEA21432() throws Exception { doTest(true, false); } public void testUncheckedWarningIDEA26738() throws Exception { doTest(true, false); } public void testDefaultMethodVisibility() throws Exception { doTest(true, false); } + public void testInheritUnrelatedDefaults() throws Exception { doTest(true, false); } + public void testNotInheritFromUnrelatedDefault() throws Exception { doTest(true, false); } public void testEnclosingInstance() throws Exception { doTest(false, false); } public void testWrongArgsAndUnknownTypeParams() throws Exception { doTest(false, false); } public void testAmbiguousMethodCallIDEA97983() throws Exception { doTest(false, false); }