mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-19 13:02:30 +07:00
overload resolution: don't skip static method conflicts in classes in hierarchy (IDEA-171617)
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
@@ -248,6 +248,10 @@ public class OverloadResolutionTest extends LightDaemonAnalyzerTestCase {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testPreserveStaticMethodConflictsWhenMethodsAreNotHidden() throws Exception {
|
||||
doTest(false);
|
||||
}
|
||||
|
||||
private void doTest() {
|
||||
doTest(true);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user