From 67d165e584da9cadea5d8dfa503bb8fa6586b3a2 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 13 Jun 2019 22:25:23 +0200 Subject: [PATCH] overload resolution: static methods from super interfaces should be skipped in favor to instance methods (IDEA-216009) GitOrigin-RevId: f172ea91498434cd956010df286dc418334a83b9 --- .../JavaMethodsConflictResolver.java | 14 +++++++++----- .../PreferMethodInsideSameComb.java | 11 +++++++++++ .../daemon/lambda/OverloadResolutionTest.java | 1 + 3 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/PreferMethodInsideSameComb.java diff --git a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java index 1e7936ccc8c9..0c710af195a0 100644 --- a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java +++ b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java @@ -60,6 +60,9 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ if (conflicts.isEmpty()) return null; if (conflicts.size() == 1) return conflicts.get(0); + checkStaticMethodsOfInterfaces(conflicts); + if (conflicts.size() == 1) return conflicts.get(0); + final Map map = FactoryMap.create(key -> key.getSubstitutor(false)); boolean atLeastOneMatch = checkParametersNumber(conflicts, getActualParametersLength(), map, true); if (conflicts.size() == 1) return conflicts.get(0); @@ -73,9 +76,6 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ checkParametersNumber(conflicts, getActualParametersLength(), map, false); if (conflicts.size() == 1) return conflicts.get(0); - checkStaticMethodsOfInterfaces(conflicts); - if (conflicts.size() == 1) return conflicts.get(0); - if (atLeastOneMatch) { checkPotentiallyCompatibleMethods(conflicts); if (conflicts.size() == 1) return conflicts.get(0); @@ -303,8 +303,12 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ } else if (expression == null && !ImportsUtil.hasStaticImportOn(parent, method, true)) { PsiClass qualifierClass = PsiTreeUtil.getParentOfType(parent, PsiClass.class); - if (qualifierClass != null && !PsiTreeUtil.isAncestor(method.getContainingClass(), qualifierClass, true)) { - return qualifierClass; + if (qualifierClass != null) { + PsiClass containingClass = method.getContainingClass(); + if (!PsiTreeUtil.isAncestor(containingClass, qualifierClass, true) || + qualifierClass.isInheritor(containingClass, true)) { + return qualifierClass; + } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/PreferMethodInsideSameComb.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/PreferMethodInsideSameComb.java new file mode 100644 index 000000000000..c05e0d36403c --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/PreferMethodInsideSameComb.java @@ -0,0 +1,11 @@ +interface ToStringBug { + + static void toString(String s) {} + + class Inner implements ToStringBug { + + { + toString( "x"); + } + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/OverloadResolutionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/OverloadResolutionTest.java index 4bc4a5c1ff8a..6acd6b412cef 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/OverloadResolutionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/OverloadResolutionTest.java @@ -276,6 +276,7 @@ public class OverloadResolutionTest extends LightDaemonAnalyzerTestCase { public void testUnqualifiedStaticInterfaceMethodCallsOnInnerClasses() { doTest(false);} public void testStaticMethodInSuperInterfaceConflictWithCurrentStatic() { doTest(false);} + public void testPreferMethodInsideSameComb() { doTest(false);} public void testFixedContainingClassTypeArguments() { doTest(false);} public void testPotentialCompatibilityWithArrayCreation() { doTest(false);} public void testOverloadsWithOneNonCompatible() { doTest(false);}