ambiguity (IDEA-123352)

This commit is contained in:
Anna Kozlova
2014-04-03 13:24:02 +02:00
parent 9b1c967f87
commit 1daf8f50df
5 changed files with 51 additions and 8 deletions

View File

@@ -550,15 +550,17 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
final PsiSubstitutor methodSubstitutor2 = calculateMethodSubstitutor(typeParameters2, method2, siteSubstitutor2, types2, types1AtSite, languageLevel);
boolean applicable21 = isApplicableTo(types1AtSite, method2, languageLevel, varargsPosition, methodSubstitutor2, method1, siteSubstitutor2);
final boolean typeArgsApplicable12 = GenericsUtil.isTypeArgumentsApplicable(typeParameters1, methodSubstitutor1, myArgumentsList, !applicable21);
final boolean typeArgsApplicable21 = GenericsUtil.isTypeArgumentsApplicable(typeParameters2, methodSubstitutor2, myArgumentsList, !applicable12);
if (!myLanguageLevel.isAtLeast(LanguageLevel.JDK_1_8)) {
final boolean typeArgsApplicable12 = GenericsUtil.isTypeArgumentsApplicable(typeParameters1, methodSubstitutor1, myArgumentsList, !applicable21);
final boolean typeArgsApplicable21 = GenericsUtil.isTypeArgumentsApplicable(typeParameters2, methodSubstitutor2, myArgumentsList, !applicable12);
if (!typeArgsApplicable12) {
applicable12 = false;
}
if (!typeArgsApplicable12) {
applicable12 = false;
}
if (!typeArgsApplicable21) {
applicable21 = false;
if (!typeArgsApplicable21) {
applicable21 = false;
}
}
if (applicable12 || applicable21) {
@@ -718,7 +720,7 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{
if (!substitutor.getSubstitutionMap().containsKey(typeParameter)) {
PsiType type = siteSubstitutor.substitute(typeParameter);
if (type instanceof PsiClassType && ((PsiClassType)type).resolve() instanceof PsiTypeParameter) {
type = TypeConversionUtil.erasure(type, substitutor);
type = TypeConversionUtil.erasure(type, siteSubstitutor);
}
substitutor = substitutor.put(typeParameter, type);
} else {

View File

@@ -0,0 +1,17 @@
import java.util.*;
class Test {
class Predicate<T> {
<S extends T> boolean test(final Collection<T> src) {
return true;
}
<S extends T> boolean test(final Iterable<T> iterable) {
return false;
}
}
public void testPredicate() {
final Predicate<Integer> predicate = new Predicate<>();
predicate.test(new ArrayList<Integer>());
}
}

View File

@@ -0,0 +1,19 @@
import java.util.*;
class Test {
class Predicate<T> {
private <<warning descr="Type parameter 'S' is never used">S</warning> extends T> boolean test(final Collection<T> src) {
System.out.println(src);
return true;
}
private <<warning descr="Type parameter 'S' is never used">S</warning> extends T> boolean <warning descr="Private method 'test(java.lang.Iterable<T>)' is never used">test</warning>(final Iterable<T> iterable) {
System.out.println(iterable);
return false;
}
}
public void testPredicate() {
final Predicate<Integer> predicate = new Predicate<>();
predicate.test(new ArrayList<Integer>());
}
}

View File

@@ -341,6 +341,7 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase {
public void testIDEA120563() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
public void testIDEA121400() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
public void testIDEA123316() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
public void testIDEA123352() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
public void testJavaUtilCollections_NoVerify() throws Exception {
PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule()));

View File

@@ -71,6 +71,10 @@ public class MostSpecificResolutionTest extends LightDaemonAnalyzerTestCase {
doTest();
}
public void testIDEA123352() throws Exception {
doTest();
}
private void doTest() {
doTest(true);
}