overload resolution: don't skip static method conflicts in classes in hierarchy (IDEA-171617)

This commit is contained in:
Anna.Kozlova
2017-04-19 11:34:08 +02:00
parent 33acc24089
commit 16b0cce4f6
3 changed files with 20 additions and 12 deletions

View File

@@ -679,12 +679,12 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
if (class1 != class2) {
if (class2.isInheritor(class1, true)) {
if (isSubSignature(method1, method2, classSubstitutor1, classSubstitutor2, boxingHappened)) {
if (MethodSignatureUtil.isSubsignature(method1.getSignature(classSubstitutor1), method2.getSignature(classSubstitutor2))) {
return Specifics.SECOND;
}
}
else if (class1.isInheritor(class2, true)) {
if (isSubSignature(method2, method1, classSubstitutor2, classSubstitutor1, boxingHappened)) {
if (MethodSignatureUtil.isSubsignature(method2.getSignature(classSubstitutor2), method1.getSignature(classSubstitutor1))) {
return Specifics.FIRST;
}
}
@@ -706,16 +706,6 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
return parameterType instanceof PsiPrimitiveType ^ isExpressionTypePrimitive;
}
private static boolean isSubSignature(PsiMethod method1,
PsiMethod method2,
PsiSubstitutor classSubstitutor1,
PsiSubstitutor classSubstitutor2,
boolean[] boxingHappened) {
return MethodSignatureUtil.areErasedParametersEqual(method1.getSignature(PsiSubstitutor.EMPTY), method2.getSignature(PsiSubstitutor.EMPTY)) &&
MethodSignatureUtil.isSubsignature(method1.getSignature(classSubstitutor1), method2.getSignature(classSubstitutor2)) ||
method1.hasModifierProperty(PsiModifier.STATIC) && method2.hasModifierProperty(PsiModifier.STATIC) && !boxingHappened[0];
}
private boolean isApplicableTo(@NotNull PsiType[] types2AtSite,
@NotNull PsiMethod method1,
@NotNull final LanguageLevel languageLevel,

View File

@@ -0,0 +1,14 @@
import java.util.function.Function;
import java.util.function.IntFunction;
class A {
static void foo(Function<String, String> f) {}
}
class B extends A {
static void foo(IntFunction<String> f) {}
public static void main(String[] args) {
<error descr="Ambiguous method call: both 'B.foo(IntFunction<String>)' and 'A.foo(Function<String, String>)' match">foo</error>(a -> "1");
}
}

View File

@@ -248,6 +248,10 @@ public class OverloadResolutionTest extends LightDaemonAnalyzerTestCase {
doTest();
}
public void testPreserveStaticMethodConflictsWhenMethodsAreNotHidden() throws Exception {
doTest(false);
}
private void doTest() {
doTest(true);
}