From d49391b689b6ba7aa6a37ec7f4b24d4a82943402 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 30 Apr 2013 18:07:21 +0200 Subject: [PATCH] generics: do not prefer type with more bounds when additional bounds are just subtypes of the rest, discard unchecked conversion (IDEA-67669) --- .../JavaMethodsConflictResolver.java | 36 ++++++++++--------- .../AmbiguousMethodCallIDEA67669.java | 17 +++++++++ .../daemon/LightAdvHighlightingJdk7Test.java | 1 + 3 files changed, 38 insertions(+), 16 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/AmbiguousMethodCallIDEA67669.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 6f1b08d3e3ca..cf75c7ec69d3 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 @@ -32,7 +32,10 @@ import gnu.trove.TIntArrayList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; /** * Created by IntelliJ IDEA. @@ -630,19 +633,19 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ PsiType type2, PsiTypeParameter p1, PsiTypeParameter p2) { - final Set resolved1 = new HashSet(); + final Map resolved1 = new HashMap(); for (PsiClassType referenceElement : p1.getExtendsList().getReferencedTypes()) { - final PsiClass resolve = referenceElement.resolve(); - if (resolve != null) { - resolved1.add(resolve); + final PsiClass aClass = referenceElement.resolve(); + if (aClass != null) { + resolved1.put(aClass, referenceElement); } } - final Set resolved2 = new HashSet(); + final Map resolved2 = new HashMap(); for (PsiClassType referenceElement : p2.getExtendsList().getReferencedTypes()) { - final PsiClass resolve = referenceElement.resolve(); - if (resolve != null) { - resolved2.add(resolve); + final PsiClass aClass = referenceElement.resolve(); + if (aClass != null) { + resolved2.put(aClass, referenceElement); } } @@ -664,15 +667,16 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ } } - private static Specifics checkExtendsList(Set resolved1, - Set resolved2, + private static Specifics checkExtendsList(Map resolved1, + Map resolved2, Specifics preferred) { - if (resolved1.containsAll(resolved2)){ - resolved1.removeAll(resolved2); - for (Iterator iterator = resolved1.iterator(); iterator.hasNext(); ) { + if (resolved1.keySet().containsAll(resolved2.keySet())){ + resolved1.keySet().removeAll(resolved2.keySet()); + for (Iterator iterator = resolved1.keySet().iterator(); iterator.hasNext(); ) { PsiClass psiClass = iterator.next(); - for (PsiClass aClass : resolved2) { - if (InheritanceUtil.isInheritorOrSelf(aClass, psiClass, true)) { + final PsiClassType baseType = resolved1.get(psiClass); + for (PsiClassType childType : resolved2.values()) { + if (TypeConversionUtil.isAssignable(baseType, childType, false)) { iterator.remove(); break; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/AmbiguousMethodCallIDEA67669.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/AmbiguousMethodCallIDEA67669.java new file mode 100644 index 000000000000..ed1f8df47c6f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/AmbiguousMethodCallIDEA67669.java @@ -0,0 +1,17 @@ +import java.util.Collection; +import java.util.List; + +interface A +{ + & List> void foo(S x); + String foo(S x); +} + + +class B +{ + public static void main(String[] args) { + A a = null; + char c = a.foo(null).charAt(0); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java index b403bdaa24e8..0bc2fd4049a5 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java @@ -172,6 +172,7 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase { public void testAmbiguousMethodCallIDEA100314() { doTest(false, false); } public void testAmbiguousMethodCallIDEA67668() { doTest(false, false); } public void testAmbiguousMethodCallIDEA67671() { doTest(false, false); } + public void testAmbiguousMethodCallIDEA67669() { doTest(false, false); } public void testInstanceMemberNotAccessibleInStaticContext() { doTest(false, false); } public void testRejectedTypeParamsForConstructor() { doTest(false, false); } public void testAnnotationArgs() throws Exception { doTest(false, false);}