From 60622337c322914a77dcf37b489aec7f5d43d9e6 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 19 Apr 2012 23:41:52 +0400 Subject: [PATCH] Implemented stub of highlighting parameters in error tooltip for NONE_APPLICABLE. --- .../plugin/highlighter/IdeErrorMessages.java | 71 ++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index d8cc81dfaa0..66d97803a6a 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -16,15 +16,27 @@ package org.jetbrains.jet.plugin.highlighter; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; +import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; +import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters1; +import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.diagnostics.rendering.*; +import org.jetbrains.jet.lang.psi.JetValueArgument; +import org.jetbrains.jet.lang.psi.JetValueArgumentList; +import org.jetbrains.jet.lang.psi.ValueArgument; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; +import org.jetbrains.jet.lang.resolve.calls.ResolvedCallImpl; +import org.jetbrains.jet.lang.resolve.calls.ResolvedValueArgument; import org.jetbrains.jet.resolve.DescriptorRenderer; import java.util.Collection; +import java.util.Map; import static org.jetbrains.jet.lang.diagnostics.Errors.*; import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.*; @@ -54,6 +66,62 @@ public class IdeErrorMessages { } }; + private static final Renderer>> NONE_APPLICABLE_CALLS = + new Renderer>>() { + @Nullable + private ValueParameterDescriptor findParameterByArgumentExpression( + ResolvedCall call, + JetValueArgument argument) { + for (Map.Entry entry : call.getValueArguments() + .entrySet()) { + for (ValueArgument va : entry.getValue().getArguments()) { + if (va == argument) { + return entry.getKey(); + } + } + } + return null; + } + + @NotNull + @Override + public String render(@NotNull Collection> calls) { + StringBuilder stringBuilder = new StringBuilder(""); + for (ResolvedCall call : calls) { + stringBuilder.append("
  • "); + stringBuilder.append(DescriptorRenderer.HTML.render(call.getResultingDescriptor())); + if (call instanceof ResolvedCallImpl) { + Collection diagnostics = ((ResolvedCallImpl)call).getTrace().getBindingContext().getDiagnostics(); + stringBuilder.append(" | "); + for (Diagnostic diagnostic : diagnostics) { + //stringBuilder.append(DefaultErrorMessages.RENDERER.render(diagnostic)); + PsiElement element = diagnostic.getPsiElement(); + JetValueArgumentList argumentList = PsiTreeUtil.getParentOfType(element, JetValueArgumentList.class, false); + assert argumentList != null; + JetValueArgument argument = PsiTreeUtil.getParentOfType(element, JetValueArgument.class, false); + if (diagnostic.getFactory() == Errors.TOO_MANY_ARGUMENTS) { + stringBuilder.append("LAST )"); + } else if (diagnostic.getFactory() == Errors.NO_VALUE_FOR_PARAMETER) { + ValueParameterDescriptor valueParameterDescriptor = + ((DiagnosticWithParameters1)diagnostic).getA(); + stringBuilder.append("ARGUMENT ").append(valueParameterDescriptor.getName()).append(" "); + } else { + if (argument != null) { + assert argument.getParent() == argumentList; // TODO check that this really can't happen + ValueParameterDescriptor parameter = findParameterByArgumentExpression(call, argument); + if (parameter != null) { + stringBuilder.append("ARGUMENT ").append(parameter.getName()).append(" "); + } + } + } + } + } + stringBuilder.append("
  • "); + } + return stringBuilder.toString(); + } + }; + static { MAP.put(TYPE_MISMATCH, "Type mismatch.
    Required:{0}
    Found:{1}
    ", RENDER_TYPE, RENDER_TYPE); @@ -103,7 +171,8 @@ public class IdeErrorMessages { "Found:{2}", TO_STRING, RENDER_TYPE, RENDER_TYPE); MAP.put(OVERLOAD_RESOLUTION_AMBIGUITY, "Overload resolution ambiguity. All these functions match.
      {0}
    ", HTML_AMBIGUOUS_CALLS); - MAP.put(NONE_APPLICABLE, "None of the following functions can be called with the arguments supplied.
      {0}
    ", HTML_AMBIGUOUS_CALLS); + MAP.put(NONE_APPLICABLE, "None of the following functions can be called with the arguments supplied.
      {0}
    ", + NONE_APPLICABLE_CALLS); MAP.setImmutable(); }