summaryrefslogtreecommitdiff
path: root/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java
diff options
context:
space:
mode:
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.java26
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;
+ }
}