overload resolution: detect qualifier of unqualified call by processDeclaration's source where candidate was found

conflict resolution for static methods of the interface found by inheritance and nesting

GitOrigin-RevId: b637b02de4f59010a138c66890d1efcbcd1d588d
This commit is contained in:
Anna Kozlova
2019-10-30 22:14:46 +01:00
committed by intellij-monorepo-bot
parent 25053f075f
commit 856ec460c6
2 changed files with 18 additions and 17 deletions

View File

@@ -269,21 +269,19 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
*/
private void checkStaticMethodsOfInterfaces(@NotNull List<CandidateInfo> conflicts) {
if (!(myArgumentsList instanceof PsiExpressionList)) return;
PsiClass qualifierClass = null;
for (Iterator<CandidateInfo> iterator = conflicts.iterator(); iterator.hasNext(); ) {
CandidateInfo conflict = iterator.next();
if (!(conflict instanceof MethodCandidateInfo)) continue;
final PsiMethod method = ((MethodCandidateInfo)conflict).getElement();
if (method.hasModifierProperty(PsiModifier.STATIC)) {
if (conflict.getCurrentFileResolveScope() instanceof PsiImportStaticStatement) continue;
PsiElement currentFileResolveScope = conflict.getCurrentFileResolveScope();
if (currentFileResolveScope instanceof PsiImportStaticStatement) continue;
final PsiClass containingClass = method.getContainingClass();
if (containingClass != null && containingClass.isInterface()) {
if (qualifierClass == null) {
qualifierClass = getQualifiedClass(method);
if (qualifierClass == null) return;
}
PsiClass qualifierClass = getQualifiedClass(currentFileResolveScope);
if (!containingClass.getManager().areElementsEquivalent(containingClass, qualifierClass)) {
if (qualifierClass != null &&
!containingClass.getManager().areElementsEquivalent(containingClass, qualifierClass)) {
iterator.remove();
}
}
@@ -291,7 +289,7 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
}
}
private PsiClass getQualifiedClass(PsiMethod method) {
private PsiClass getQualifiedClass(PsiElement resolveScope) {
final PsiElement parent = myArgumentsList.getParent();
if (parent instanceof PsiMethodCallExpression) {
final PsiExpression expression = ((PsiMethodCallExpression)parent).getMethodExpression().getQualifierExpression();
@@ -301,15 +299,8 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
return (PsiClass)resolve;
}
}
else if (expression == null && !ImportsUtil.hasStaticImportOn(parent, method, true)) {
PsiClass qualifierClass = PsiTreeUtil.getParentOfType(parent, PsiClass.class);
if (qualifierClass != null) {
PsiClass containingClass = method.getContainingClass();
if (!PsiTreeUtil.isAncestor(containingClass, qualifierClass, true) ||
qualifierClass.isInheritor(containingClass, true)) {
return qualifierClass;
}
}
else if (expression == null && resolveScope instanceof PsiClass) {
return (PsiClass)resolveScope;
}
if (expression != null) {

View File

@@ -66,4 +66,14 @@ class StaticMethodInterfaceExample2 {
}
}
}
}
interface StaticMethodInterfaceExample3 {
static void m() { }
class MyClass implements StaticMethodInterfaceExample3 {
{
m();
}
}
}