From 1d6641db8065b6f79fbcf6c68d6268ad3c1593d6 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Wed, 13 Dec 2017 13:44:11 +0100 Subject: [PATCH] overload resolution: check method hiding for static only (IDEA-183712) non-static methods should already be covered by same signatures check --- .../JavaMethodsConflictResolver.java | 4 ++-- .../OverriddenMethodWithOtherRawSignature.java | 13 +++++++++++++ .../daemon/lambda/OverloadResolutionTest.java | 2 ++ 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/OverriddenMethodWithOtherRawSignature.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 a0b57f581790..1e66c41eea16 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 @@ -214,7 +214,7 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ final PsiClass containingClass = method.getContainingClass(); final boolean isInterface = containingClass != null && containingClass.isInterface(); for (HierarchicalMethodSignature methodSignature : method.getHierarchicalMethodSignature().getSuperSignatures()) { - final PsiMethod superMethod = methodSignature.getMethod(); + PsiMethod superMethod = PsiSuperMethodUtil.correctMethodByScope(methodSignature.getMethod(), myArgumentsList.getResolveScope()); if (!isInterface) { superMethods.add(superMethod); } @@ -587,7 +587,7 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ } } - if (class1 != class2) { + if (class1 != class2 && (method1.hasModifierProperty(PsiModifier.STATIC) || method2.hasModifierProperty(PsiModifier.STATIC))) { if (class2.isInheritor(class1, true)) { if (MethodSignatureUtil.isSubsignature(method1.getSignature(classSubstitutor1), method2.getSignature(classSubstitutor2))) { return Specifics.SECOND; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/OverriddenMethodWithOtherRawSignature.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/OverriddenMethodWithOtherRawSignature.java new file mode 100644 index 000000000000..881da9311282 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/OverriddenMethodWithOtherRawSignature.java @@ -0,0 +1,13 @@ +class X { + void method(String t) { } +} + +class Y extends X { + void method(S s) { } +} + +class Test { + void x(final Y err) { + err.method(""); + } +} \ No newline at end of file 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 652bfdea7556..37a6f098f620 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 @@ -262,6 +262,8 @@ public class OverloadResolutionTest extends LightDaemonAnalyzerTestCase { public void testAdaptReturnTypesOfSiblingMethods() { doTest(false);} + public void testOverriddenMethodWithOtherRawSignature() { doTest(false);} + public void testUnqualifiedStaticInterfaceMethodCallsOnInnerClasses() { doTest(false);} public void testStaticMethodInSuperInterfaceConflictWithCurrentStatic() { doTest(false);}