From eddc550139306137144e4762bb5d6418b9d002a3 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 20 Apr 2012 13:27:53 +0400 Subject: [PATCH] Implemented highlighting arguments which don't fit in tooltip. --- .../plugin/highlighter/IdeErrorMessages.java | 95 +++++++++++++------ 1 file changed, 64 insertions(+), 31 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index 66d97803a6a..dc3ce62f1c3 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -22,6 +22,7 @@ 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.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters1; @@ -30,13 +31,15 @@ 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.DescriptorUtils; +import org.jetbrains.jet.lang.resolve.FqName; +import org.jetbrains.jet.lang.resolve.FqNameUnsafe; 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 java.util.*; import static org.jetbrains.jet.lang.diagnostics.Errors.*; import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.*; @@ -83,39 +86,69 @@ public class IdeErrorMessages { 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(" "); - } + private Set getParametersToHighlight(ResolvedCall call) { + Set parameters = new HashSet(); + if (call instanceof ResolvedCallImpl) { + Collection diagnostics = ((ResolvedCallImpl)call).getTrace().getBindingContext().getDiagnostics(); + 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) { + parameters.add(null); + } else if (diagnostic.getFactory() == Errors.NO_VALUE_FOR_PARAMETER) { + ValueParameterDescriptor parameter = + ((DiagnosticWithParameters1)diagnostic).getA(); + parameters.add(parameter); + } else { + if (argument != null) { + assert argument.getParent() == argumentList; // TODO check that this really can't happen + ValueParameterDescriptor parameter = findParameterByArgumentExpression(call, argument); + if (parameter != null) { + parameters.add(parameter); } } } } + } + return parameters; + } + + @NotNull + @Override + public String render(@NotNull Collection> calls) { + String RED_TEMPLATE = "%s"; + + StringBuilder stringBuilder = new StringBuilder(""); + for (ResolvedCall call : calls) { + stringBuilder.append("
  • "); + CallableDescriptor funDescriptor = call.getResultingDescriptor(); + Set parametersToHighlight = getParametersToHighlight(call); + + stringBuilder.append(funDescriptor.getName()).append("("); + boolean first = true; + DescriptorRenderer htmlRend = DescriptorRenderer.HTML; + for (ValueParameterDescriptor parameter : funDescriptor.getValueParameters()) { + if (!first) { + stringBuilder.append(", "); + } + String paramType = htmlRend.renderType(parameter.getType()); + if (parametersToHighlight.contains(parameter)) { + paramType = String.format(RED_TEMPLATE, paramType); + } + stringBuilder.append(paramType); + + first = false; + } + stringBuilder.append(parametersToHighlight.contains(null) ? String.format(RED_TEMPLATE, ")") : ")"); + stringBuilder.append(" ").append(htmlRend.renderMessage("defined in")).append(" "); + DeclarationDescriptor containingDeclaration = funDescriptor.getContainingDeclaration(); + if (containingDeclaration != null) { + FqNameUnsafe fqName = DescriptorUtils.getFQName(containingDeclaration); + stringBuilder.append(FqName.ROOT.toUnsafe().equals(fqName) ? "root package" : fqName.getFqName()); + } stringBuilder.append("
  • "); } return stringBuilder.toString();