extract inference errors from parent calls when applicable

This commit is contained in:
Anna Kozlova
2016-01-26 17:30:03 +03:00
parent c469bc34ef
commit 8e7c92fce8
3 changed files with 29 additions and 23 deletions
@@ -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+= "</table>";
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", "<br/>");
@@ -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();
@@ -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);
}