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 7d59b98b1fcf..63463365e556 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 @@ -101,6 +101,18 @@ public class TypesDistinctProver { final PsiClassType.ClassResolveResult classResolveResult1 = PsiUtil.resolveGenericsClassInType(type1); final PsiClassType.ClassResolveResult classResolveResult2 = PsiUtil.resolveGenericsClassInType(type2); + + final PsiClass boundClass1 = classResolveResult1.getElement(); + final PsiClass boundClass2 = classResolveResult2.getElement(); + + if (boundClass1 instanceof PsiTypeParameter && level < 2) { + if (!distinguishFromTypeParam((PsiTypeParameter)boundClass1, boundClass2, type1)) return false; + } + + if (boundClass2 instanceof PsiTypeParameter && level < 2) { + if (!distinguishFromTypeParam((PsiTypeParameter)boundClass2, boundClass1, type2)) return false; + } + if (Comparing.equal(TypeConversionUtil.erasure(type1), TypeConversionUtil.erasure(type2))) { final PsiSubstitutor substitutor1 = classResolveResult1.getSubstitutor(); final PsiSubstitutor substitutor2 = classResolveResult2.getSubstitutor(); @@ -124,16 +136,6 @@ public class TypesDistinctProver { if (level < 2) return false; } - final PsiClass boundClass1 = classResolveResult1.getElement(); - final PsiClass boundClass2 = classResolveResult2.getElement(); - - if (boundClass1 instanceof PsiTypeParameter && level < 2) { - if (!distinguishFromTypeParam((PsiTypeParameter)boundClass1, boundClass2, type1)) return false; - } - - if (boundClass2 instanceof PsiTypeParameter && level < 2) { - if (!distinguishFromTypeParam((PsiTypeParameter)boundClass2, boundClass1, type2)) return false; - } return type2 != null && type1 != null && !type1.equals(type2) && (!InheritanceUtil.isInheritorOrSelf(boundClass1, boundClass2, true) || !InheritanceUtil.isInheritorOrSelf(boundClass2, boundClass1, true)); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/CastFromGenericTypeWithTypeParameterWithExtendsAsArgument.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/CastFromGenericTypeWithTypeParameterWithExtendsAsArgument.java new file mode 100644 index 000000000000..8149db1825d5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/CastFromGenericTypeWithTypeParameterWithExtendsAsArgument.java @@ -0,0 +1,11 @@ +import java.util.Map; + +class Test { + public static > void groupingBy(Supplier mapFactory) { + Supplier> mangledFactory = (Supplier>) mapFactory; + System.out.println(mangledFactory); + } + + interface Supplier<G> {} +} + 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 16d145bd2c93..9a53badad5ef 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -484,6 +484,10 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } + public void testCastFromGenericTypeWithTypeParameterWithExtendsAsArgument() throws Exception { + doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, true); + } + public void testJavaUtilCollections_NoVerify() throws Exception { PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule())); assertNotNull(collectionsClass);