overload resolution: resolve conflicts with static methods in super interfaces

This commit is contained in:
Anna.Kozlova
2017-10-24 10:49:54 +02:00
parent e412b361c7
commit 6bb976899e
3 changed files with 21 additions and 3 deletions

View File

@@ -299,10 +299,12 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
final PsiClass containingClass = method.getContainingClass();
if (containingClass != null && containingClass.isInterface()) {
if (qualifierClass == null) {
qualifierClass = getQualifiedClass();
qualifierClass = getQualifiedClass(method);
if (qualifierClass == null) return;
}
if (!containingClass.getManager().areElementsEquivalent(containingClass, qualifierClass)) {
if (!containingClass.getManager().areElementsEquivalent(containingClass, qualifierClass) &&
!PsiTreeUtil.isAncestor(containingClass, qualifierClass, false)) {
iterator.remove();
}
}
@@ -310,7 +312,7 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
}
}
private PsiClass getQualifiedClass() {
private PsiClass getQualifiedClass(PsiMethod method) {
final PsiElement parent = myArgumentsList.getParent();
if (parent instanceof PsiMethodCallExpression) {
final PsiExpression expression = ((PsiMethodCallExpression)parent).getMethodExpression().getQualifierExpression();
@@ -320,6 +322,9 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
return (PsiClass)resolve;
}
}
else if (expression == null && !ImportsUtil.hasStaticImportOn(parent, method, true)) {
return PsiTreeUtil.getParentOfType(parent, PsiClass.class);
}
if (expression != null) {
return PsiUtil.resolveClassInType(expression.getType());

View File

@@ -0,0 +1,11 @@
interface A {
static void m() {}
}
interface B extends A {
static void m() {}
default void f() {
m();
}
}

View File

@@ -264,6 +264,8 @@ public class OverloadResolutionTest extends LightDaemonAnalyzerTestCase {
public void testUnqualifiedStaticInterfaceMethodCallsOnInnerClasses() { doTest(false);}
public void testStaticMethodInSuperInterfaceConflictWithCurrentStatic() { doTest(false);}
private void doTest() {
doTest(true);
}