Interface.super method calls: ensure valid qualifier (IDEA-173888)

forbid calls to super methods which are overridden in direct superinterfaces
This commit is contained in:
Anna Kozlova
2017-06-05 14:00:14 +03:00
parent 893f166226
commit 12c350758d
2 changed files with 29 additions and 3 deletions

View File

@@ -1579,11 +1579,13 @@ public class HighlightUtil extends HighlightUtilBase {
final PsiElement parent = expr.getParent();
final PsiElement resolved = parent instanceof PsiReferenceExpression ? ((PsiReferenceExpression)parent).resolve() : null;
PsiClass containingClass =
ObjectUtils.notNull(resolved instanceof PsiMethod ? ((PsiMethod)resolved).getContainingClass() : null, aClass);
for (PsiClass superClass : classT.getSupers()) {
if (superClass.isInheritor(aClass, true)) {
if (superClass.isInheritor(containingClass, true)) {
String cause = null;
if (superClass.isInterface()) {
cause = "redundant interface " + format(aClass) + " is extended by ";
if (superClass.isInheritor(aClass, true) && superClass.isInterface()) {
cause = "redundant interface " + format(containingClass) + " is extended by ";
}
else if (resolved instanceof PsiMethod &&
MethodSignatureUtil.findMethodBySuperMethod(superClass, (PsiMethod)resolved, true) != resolved) {

View File

@@ -81,3 +81,27 @@ class InsideThisRxpression {
public interface Bar extends Foo {}
}
class SameDefaultMethodDifferentInheritors {
interface A { default void a() {} }
interface B extends A { default void a() {} }
interface B1 extends A { }
interface C extends A {}
class Clazz implements B, C {
{
<error descr="Bad type qualifier in default super call: method a is overridden in SameDefaultMethodDifferentInheritors.B">C</error>.super.a();
}
}
class Clazz1 implements B1, C {
{
C.super.a();
}
}
class Clazz2 implements C {
{
C.super.a();
}
}
}