unrelated defaults: check if current class contains explicit method (IDEA-164732)

This commit is contained in:
Anna.Kozlova
2016-12-02 11:09:46 +01:00
parent 4cddcc91a3
commit 382b78aeca
3 changed files with 32 additions and 0 deletions

View File

@@ -458,6 +458,7 @@ public class GenericsHighlightUtil {
if (!hasConcrete && defaults != null) {
final PsiMethod defaultMethod = defaults.get(0);
if (MethodSignatureUtil.findMethodBySuperMethod(aClass, defaultMethod, false) != null) continue;
final PsiClass defaultMethodContainingClass = defaultMethod.getContainingClass();
if (defaultMethodContainingClass == null) continue;
final PsiMethod unrelatedMethod = abstracts != null ? abstracts.get(0) : defaults.get(1);

View File

@@ -0,0 +1,27 @@
interface A<E> {
void foo(E item);
}
interface B1<E> extends A<E> {
@Override
default void foo(E item) {}
}
interface B2<E> extends A<E> {
@Override
default void foo(E item) {}
}
interface C1<E> extends B1<E> {}
interface C2<E> extends B2<E> {}
interface Bottom1<E> extends C2<E>, C1<E> {
@Override
default void foo(E item) {}
}
interface Bottom2<E> extends C2<E>, C1<E> {
@Override
void foo(E item);
}
interface <error descr="Bottom3 inherits unrelated defaults for foo(E) from types B2 and B1">Bottom3</error><E> extends C2<E>, C1<E> {}

View File

@@ -71,6 +71,10 @@ public class Interface8MethodsHighlightingTest extends LightCodeInsightFixtureTe
doTest(false, false);
}
public void testUnrelatedDefaultsWhenOverridingIsPresentExplicitly() throws Exception {
doTest(false, false);
}
public void testStaticMethodAccessibleBothThroughStaticImportAndInheritance() throws Exception {
myFixture.addClass("package p; public interface Foo {" +
" static void foo() {}" +