diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java index 1106633efdb0..76fcac865c45 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java @@ -971,7 +971,9 @@ public class TypeConversionUtil { private static final RecursionGuard ourGuard = RecursionManager.createGuard("isAssignable"); - public static boolean typesAgree(@NotNull PsiType typeLeft, @NotNull PsiType typeRight, final boolean allowUncheckedConversion) { + public static boolean typesAgree(final @NotNull PsiType typeLeft, + final @NotNull PsiType typeRight, + final boolean allowUncheckedConversion) { if (typeLeft instanceof PsiWildcardType) { final PsiWildcardType leftWildcard = (PsiWildcardType)typeLeft; final PsiType leftBound = leftWildcard.getBound(); @@ -1015,7 +1017,14 @@ public class TypeConversionUtil { return isAssignable(leftBound, typeRight, effectiveAllowUncheckedConversion && !containsWildcards(leftBound)); } else { // isSuper - return isAssignable(typeRight, leftBound, false); + final Boolean assignable = ourGuard.doPreventingRecursion(leftWildcard, true, new NotNullComputable() { + @NotNull + @Override + public Boolean compute() { + return isAssignable(typeRight, leftBound, false); + } + }); + return assignable == null || assignable.booleanValue(); } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SOEInInfiniteTypesWithSuperWildcards.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SOEInInfiniteTypesWithSuperWildcards.java new file mode 100644 index 000000000000..7647d2e88e98 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SOEInInfiniteTypesWithSuperWildcards.java @@ -0,0 +1,11 @@ + +class AsId > implements Id {} +interface HasId> {} +interface Id>{} + +interface Pong {} +class Ping implements Pong>>> { + static void Ping() { + Pong> Ping = new Ping(); + } +} \ 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 4b8f1b6a4701..43712f70a119 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -475,6 +475,11 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } + public void testSOEInInfiniteTypesWithSuperWildcards() 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);