From 3d9f911dc3e6c272b6f9c481a5eb2f5160da019b Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 8 Jan 2015 19:26:28 +0100 Subject: [PATCH] type distinct: allow comparisons of type X == X (IDEA-135041) --- .../psi/util/TypesDistinctProver.java | 6 ++++- ...ssignabilityBetweenWildcardsAndArrays.java | 24 +++++++++++++++++++ .../daemon/GenericsHighlightingTest.java | 4 ++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/AssignabilityBetweenWildcardsAndArrays.java diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java b/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java index 5e13c8f780fc..9a3fc135e16f 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java +++ b/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java @@ -260,7 +260,11 @@ public class TypesDistinctProver { } else if (bound instanceof PsiWildcardType) { final PsiType boundBound = ((PsiWildcardType)bound).getBound(); - return boundBound != null && !boundBound.equals(type); + if (boundBound != null && !boundBound.equals(type)) { + final PsiClass psiClass = PsiUtil.resolveClassInClassTypeOnly(boundBound); + return psiClass == null || !(((PsiWildcardType)bound).isExtends() && possibleClasses.contains(psiClass)); + } + return false; } return true; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/AssignabilityBetweenWildcardsAndArrays.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/AssignabilityBetweenWildcardsAndArrays.java new file mode 100644 index 000000000000..709249ddb8b1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/AssignabilityBetweenWildcardsAndArrays.java @@ -0,0 +1,24 @@ +import java.io.Serializable; + +class B {} +abstract class A { + abstract Class get(); + abstract Class get1(); + abstract Class get2(); + + abstract Class get3(); + abstract Class get4(); + + abstract Class get5(); + abstract Class get6(); + + { + if (get() == byte[].class); + if (get1() == byte[].class); + if (get2() == byte[].class); + if (get3() == byte[].class); + if (get4() == byte[].class); + if (get5() == byte[].class); + if (get6() == byte[].class); + } +} \ No newline at end of file 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 bb377400bd06..87677f08bf2a 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -450,6 +450,10 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } + public void testAssignabilityBetweenWildcardsAndArrays() throws Exception { + 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())); assertNotNull(collectionsClass);