diff options
Diffstat (limited to 'java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java')
-rw-r--r-- | java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java index 7f8d01382b09..c23ebdd00855 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java @@ -1292,5 +1292,31 @@ public class GenericsHighlightUtil { } } } + + public static HighlightInfo checkInferredIntersections(PsiSubstitutor substitutor, TextRange ref) { + for (Map.Entry<PsiTypeParameter, PsiType> typeEntry : substitutor.getSubstitutionMap().entrySet()) { + final PsiType type = typeEntry.getValue(); + if (type instanceof PsiIntersectionType) { + final PsiType[] conjuncts = ((PsiIntersectionType)type).getConjuncts(); + for (int i = 0; i < conjuncts.length; i++) { + PsiClass conjunct = PsiUtil.resolveClassInClassTypeOnly(conjuncts[i]); + if (conjunct != null && !conjunct.isInterface()) { + for (int i1 = i + 1; i1 < conjuncts.length; i1++) { + PsiClass oppositeConjunct = PsiUtil.resolveClassInClassTypeOnly(conjuncts[i1]); + if (oppositeConjunct != null && !oppositeConjunct.isInterface()) { + if (!conjunct.isInheritor(oppositeConjunct, true) && !oppositeConjunct.isInheritor(conjunct, true)) { + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) + .descriptionAndTooltip("Type parameter " + typeEntry.getKey().getName() + " has incompatible upper bounds: " + + conjunct.getName() + " and " + oppositeConjunct.getName()) + .range(ref).create(); + } + } + } + } + } + } + } + return null; + } } |