mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-30 02:09:59 +07:00
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:
committed by
intellij-monorepo-bot
parent
25053f075f
commit
856ec460c6
@@ -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) {
|
||||
|
||||
@@ -66,4 +66,14 @@ class StaticMethodInterfaceExample2 {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
interface StaticMethodInterfaceExample3 {
|
||||
static void m() { }
|
||||
|
||||
class MyClass implements StaticMethodInterfaceExample3 {
|
||||
{
|
||||
m();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user