From e777a6d77d0c854c196f7823741710f3d14548c4 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 6 Aug 2013 21:55:11 +0200 Subject: [PATCH] ambiguity: forgotten check on class type when check for type args (IDEA-67865) --- .../JavaMethodsConflictResolver.java | 22 ++++++++++++++----- .../genericsHighlighting/IDEA67865.java | 11 ++++++++++ .../daemon/GenericsHighlightingTest.java | 1 + 3 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA67865.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 50218fe92adf..4e6fa6c6cec0 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 @@ -616,19 +616,31 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ final Map map1 = classSubstitutor1.getSubstitutionMap(); final Map map2 = classSubstitutor2.getSubstitutionMap(); if (map1.size() == 1 && map2.size() == 1) { + boolean leftAssignable = InheritanceUtil.isInheritorOrSelf(aClass2, aClass1, true); + boolean rightAssignable = InheritanceUtil.isInheritorOrSelf(aClass1, aClass2, true); final PsiType t1 = map1.values().iterator().next(); final PsiType t2 = map2.values().iterator().next(); boolean raw1 = t1 instanceof PsiClassType && ((PsiClassType)t1).hasParameters(); boolean raw2 = t2 instanceof PsiClassType && ((PsiClassType)t2).hasParameters(); - if (!raw1 && raw2) return Specifics.FIRST; - if (raw1 && !raw2) return Specifics.SECOND; + if (!raw1 && raw2) return leftAssignable ? Specifics.FIRST : Specifics.NEITHER; + if (raw1 && !raw2) return rightAssignable ? Specifics.SECOND : Specifics.NEITHER; final PsiTypeParameter p1 = map1.keySet().iterator().next(); final PsiTypeParameter p2 = map2.keySet().iterator().next(); - final Specifics specifics = checkTypeParams(method1, method2, classSubstitutor1, classSubstitutor2, type1, type2, p1, p2); - if (specifics != null) return specifics; - return chooseHigherDimension(t1, t2); + Specifics specifics = checkTypeParams(method1, method2, classSubstitutor1, classSubstitutor2, type1, type2, p1, p2); + if (specifics == null) { + specifics = chooseHigherDimension(t1, t2); + } + if (specifics != null) { + if (specifics == Specifics.FIRST) { + if (leftAssignable && !rightAssignable) return Specifics.NEITHER; + } + else if (specifics == Specifics.SECOND) { + if (rightAssignable && !leftAssignable) return Specifics.NEITHER; + } + } + return specifics; } return null; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA67865.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA67865.java new file mode 100644 index 000000000000..ab7d8cf9cc2d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA67865.java @@ -0,0 +1,11 @@ +import java.util.*; + +abstract class A { + static void foo(List x) { } + static > void foo(Collection x) { } + public static void main(String[] args){ + List> x = null; + foo(x); + foo(null); + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java index dda5aecf3a81..efc253f27847 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -309,6 +309,7 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testIDEA57289() { doTest5(false); } public void testIDEA57439() { doTest5(false); } public void testIDEA57312() { doTest5(false); } + public void testIDEA67865() { doTest5(false); } public void testJavaUtilCollections_NoVerify() throws Exception { PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule()));