diff --git a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java index 52888f123215..c835a4171f74 100644 --- a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java @@ -153,7 +153,7 @@ public class GenericsUtil { PsiType type2, Set> compared, PsiManager manager, - PsiClass nestedLayer, + PsiClass nestedLayer, PsiTypeParameter parameter) { Couple types = Couple.of(type1, type2); if (compared.contains(types)) { @@ -549,6 +549,14 @@ public class GenericsUtil { return false; } } + + final PsiClass extendsBoundClass = PsiUtil.resolveClassInClassTypeOnly(extendsBound); + final PsiClass boundBoundClass = PsiUtil.resolveClassInClassTypeOnly(boundBound); + if (boundBoundClass != null && extendsBoundClass != null && !boundBoundClass.isInterface() && !extendsBoundClass.isInterface()) { + return !InheritanceUtil.isInheritorOrSelf(boundBoundClass, extendsBoundClass, true) && + !InheritanceUtil.isInheritorOrSelf(extendsBoundClass, boundBoundClass, true); + } + return !TypeConversionUtil.areTypesConvertible(boundBound, extendsBound) && !TypeConversionUtil.areTypesConvertible(extendsBound, boundBound); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/ParameterBoundsWithCapturedWildcard.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/ParameterBoundsWithCapturedWildcard.java new file mode 100644 index 000000000000..c7cb266321c5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/ParameterBoundsWithCapturedWildcard.java @@ -0,0 +1,5 @@ +class Test { + public static interface EventListener {} + public void addListener (EventListener<? extends T> listener) {} + public void addListener1(EventListener listener) {} +} 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 688e83b5b198..12e8d91cabdb 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -372,6 +372,7 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testIDEA126633() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } public void testIDEA124363() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } public void testIDEA78402() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } + public void testParameterBoundsWithCapturedWildcard() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } //jdk should propagate LL 1.4 but actually it provides LL 1.7?! public void testCastObjectToIntJdk14() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_4, false); }