From 8e7c92fce8b0485a661e36976a32478b4784cbab Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 26 Jan 2016 14:42:38 +0300 Subject: [PATCH] extract inference errors from parent calls when applicable --- .../impl/analysis/HighlightMethodUtil.java | 23 ++----------------- .../impl/analysis/HighlightVisitorImpl.java | 9 ++++++-- .../psi/infos/MethodCandidateInfo.java | 20 ++++++++++++++++ 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java index 755a2bc1c2b6..bcd2424fb754 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java @@ -807,7 +807,7 @@ public class HighlightMethodUtil { @Language("HTML") @NonNls String parensizedName = methodName + (parameters.length == 0 ? "( ) " : ""); - String errorMessage = getErrorMessage(list, info); + String errorMessage = info != null ? info.getParentInferenceErrorMessage(list) : null; return JavaErrorMessages.message( "argument.mismatch.html.tooltip", Integer.valueOf(cols - parameters.length + 1), parensizedName, @@ -818,25 +818,6 @@ public class HighlightMethodUtil { ); } - private static String getErrorMessage(PsiExpressionList list, @Nullable MethodCandidateInfo info) { - String errorMessage = info != null ? info.getInferenceErrorMessage() : null; - while (errorMessage == null) { - list = PsiTreeUtil.getParentOfType(list, PsiExpressionList.class, true); - if (list == null) { - break; - } - final PsiElement parent = list.getParent(); - if (!(parent instanceof PsiCallExpression)) { - break; - } - final JavaResolveResult resolveResult = ((PsiCallExpression)parent).resolveMethodGenerics(); - if (resolveResult instanceof MethodCandidateInfo) { - errorMessage = ((MethodCandidateInfo)resolveResult).getInferenceErrorMessage(); - } - } - return errorMessage; - } - private static String esctrim(@NotNull String s) { return XmlStringUtil.escapeString(trimNicely(s)); } @@ -938,7 +919,7 @@ public class HighlightMethodUtil { } s+= ""; - final String errorMessage = getErrorMessage(list, info); + final String errorMessage = info != null ? info.getParentInferenceErrorMessage(list) : null; if (errorMessage != null) { s+= "reason: "; s += XmlStringUtil.escapeString(errorMessage).replaceAll("\n", "
"); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 9630347d7847..5d06fd83968a 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -325,8 +325,13 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh final PsiCallExpression callExpression = parent instanceof PsiExpressionList && parent.getParent() instanceof PsiCallExpression ? (PsiCallExpression)parent.getParent() : null; final JavaResolveResult containingCallResolveResult = callExpression != null ? callExpression.resolveMethodGenerics() : null; - final String errorMessage = containingCallResolveResult instanceof MethodCandidateInfo ? - ((MethodCandidateInfo)containingCallResolveResult).getInferenceErrorMessage() : null; + final String errorMessage; + if (containingCallResolveResult instanceof MethodCandidateInfo) { + errorMessage = ((MethodCandidateInfo)containingCallResolveResult).getParentInferenceErrorMessage((PsiExpressionList)parent); + } + else { + errorMessage = null; + } if (errorMessage != null) { HighlightInfo result = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) .range(expression).descriptionAndTooltip(errorMessage).create(); diff --git a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java index 93fd5331cd0a..ef932a36d2a6 100644 --- a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java +++ b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java @@ -25,6 +25,7 @@ import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.DefaultParameterTypeInferencePolicy; import com.intellij.psi.impl.source.resolve.ParameterTypeInferencePolicy; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.containers.ContainerUtil; import org.intellij.lang.annotations.MagicConstant; @@ -448,6 +449,25 @@ public class MethodCandidateInfo extends CandidateInfo{ return myInferenceError; } + public String getParentInferenceErrorMessage(PsiExpressionList list) { + String errorMessage = getInferenceErrorMessage(); + while (errorMessage == null) { + list = PsiTreeUtil.getParentOfType(list, PsiExpressionList.class, true); + if (list == null) { + break; + } + final PsiElement parent = list.getParent(); + if (!(parent instanceof PsiCallExpression)) { + break; + } + final JavaResolveResult resolveResult = ((PsiCallExpression)parent).resolveMethodGenerics(); + if (resolveResult instanceof MethodCandidateInfo) { + errorMessage = ((MethodCandidateInfo)resolveResult).getInferenceErrorMessage(); + } + } + return errorMessage; + } + public CurrentCandidateProperties createProperties() { return new CurrentCandidateProperties(this, getSiteSubstitutor(), isVarargs(), false); }