diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java index 824f5bd18e32..d1a1ab3ec0bf 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java @@ -67,6 +67,19 @@ public class GenericsHighlightUtil { PsiClassType[] extendsTypes = typeParameter.getExtendsListTypes(); for (PsiClassType type : extendsTypes) { PsiType extendsType = substitutor.substitute(type); + if (substituted instanceof PsiWildcardType && TypeConversionUtil.erasure(extendsType).equals(TypeConversionUtil.erasure(((PsiWildcardType)substituted).getExtendsBound()))){ + PsiType extendsBound = ((PsiWildcardType)substituted).getExtendsBound(); + if (extendsBound instanceof PsiClassType) { + PsiType[] parameters = ((PsiClassType)extendsBound).getParameters(); + if (parameters.length == 1) { + PsiType argType = parameters[0]; + if (argType instanceof PsiCapturedWildcardType) { + argType = ((PsiCapturedWildcardType)argType).getWildcard(); + } + if (argType instanceof PsiWildcardType && !((PsiWildcardType)argType).isBounded()) continue; + } + } + } if (!TypeConversionUtil.isAssignable(extendsType, substituted, false)) { PsiClass boundClass = extendsType instanceof PsiClassType ? ((PsiClassType)extendsType).resolve() : null; @@ -228,7 +241,7 @@ public class GenericsHighlightUtil { } @Nullable - private static HighlightInfo checkTypeParameterWithinItsBound(final PsiTypeParameter classParameter, + private static HighlightInfo checkTypeParameterWithinItsBound(PsiTypeParameter classParameter, final PsiSubstitutor substitutor, final PsiType type, final PsiElement typeElement2Highlight) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/Variance.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/Variance.java index 926e7d51cb7f..6b1406918b41 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/Variance.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/Variance.java @@ -1,4 +1,5 @@ import java.util.*; +import java.util.Comparator; /** @@ -247,3 +248,22 @@ class IDEA79360 { map = new HashMap(test); } } + +class GenericFailureExample { + + interface Descriptor> { + Class getType(); + } + + void isMarkedFaultyButCompilesClean(Descriptor n) { + bar(n.getType()); + } + + > void butThisWorks(Descriptor n) { + bar(n.getType()); + } + + > Comparator bar(Class type) { + return null; + } +} \ No newline at end of file