From cb88b2b8d11a257326d59df11c693f18495c73a0 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 4 Dec 2009 12:52:14 +0300 Subject: [PATCH] IDEADEV-41413 [anna] --- .../impl/analysis/GenericsHighlightUtil.java | 31 ++++++++++++++++++++-- .../daemon/impl/analysis/HighlightVisitorImpl.java | 7 +++-- .../src/messages/JavaErrorMessages.properties | 1 + 3 files changed, 35 insertions(+), 4 deletions(-) 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 62302313a2..6c4e787612 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 @@ -1178,8 +1178,7 @@ public class GenericsHighlightUtil { if (parameterList != null && parameterList.getTypeArguments().length > 0) { final String message = JavaErrorMessages.message("generics.select.static.class.from.parameterized.type", HighlightUtil.formatClass((PsiClass)resolved)); - return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, - parameterList, message); + return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, parameterList, message); } } } @@ -1193,5 +1192,33 @@ public class GenericsHighlightUtil { } return null; } + + public static HighlightInfo checkTopLevelMethodCallIntersectionTypeMaximalUpperBound(PsiMethodCallExpression methodCall, + PsiReferenceExpression expression) { + PsiElement parent = methodCall.getParent(); + if (parent instanceof PsiExpression) return null; + PsiType type = expression.getType(); + if (!(type instanceof PsiIntersectionType)) { + return null; + } + PsiType[] conjuncts = ((PsiIntersectionType)type).getConjuncts(); + PsiType lub = conjuncts[0]; + for (int i = 1; i < conjuncts.length; i++) { + PsiType conjunct = conjuncts[i]; + PsiType bound = GenericsUtil.getLeastUpperBound(lub, conjunct, methodCall.getManager()); + if (bound == null || !TypeConversionUtil.isAssignable(lub, bound) || !TypeConversionUtil.isAssignable(conjunct, bound)) { + PsiMethod method = methodCall.resolveMethod(); + if (method == null) return null; + String message = JavaErrorMessages.message("failed.to.find.unique.maximal.instance", + HighlightUtil.formatMethod(method), + HighlightUtil.formatType(lub), HighlightUtil.formatType(conjunct)); + + + return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, expression, message); + } + lub = bound; + } + return null; + } } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index a9b2b9bd3a..34b34e1344 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -768,8 +768,11 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh } else { PsiElement parent = expression.getParent(); - if (parent instanceof PsiMethodCallExpression && ((PsiMethodCallExpression)parent).getMethodExpression() == expression) { - myHolder.addAll(HighlightMethodUtil.checkMethodCall((PsiMethodCallExpression)parent, myResolveHelper)); + PsiMethodCallExpression methodCall; + + if (parent instanceof PsiMethodCallExpression && (methodCall = (PsiMethodCallExpression)parent).getMethodExpression() == expression) { + myHolder.addAll(HighlightMethodUtil.checkMethodCall(methodCall, myResolveHelper)); + if (!myHolder.hasErrorResults()) myHolder.add(GenericsHighlightUtil.checkTopLevelMethodCallIntersectionTypeMaximalUpperBound(methodCall, expression)); } } diff --git a/resources-en/src/messages/JavaErrorMessages.properties b/resources-en/src/messages/JavaErrorMessages.properties index 998187d6c2..fea81d6a3e 100644 --- a/resources-en/src/messages/JavaErrorMessages.properties +++ b/resources-en/src/messages/JavaErrorMessages.properties @@ -335,3 +335,4 @@ illegal.initializer=Illegal initializer for ''{0}'' class.cannot.inherit.from.its.type.parameter=Class cannot inherit from its type parameter cannot.resolve.package=Cannot resolve package {0} override.not.allowed.in.interfaces=@Override is not allowed when implementing interface method +failed.to.find.unique.maximal.instance=Cannot determine type parameters for ''{0}'': no unique maximal instance of upper bounds ''{1}'' and ''{2}'' -- 2.11.4.GIT