diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index dc3ce62f1c3..2cf93c7f94b 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -69,92 +69,6 @@ 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; - } - - 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(); - } - }; - static { MAP.put(TYPE_MISMATCH, "Type mismatch.
    Required:{0}
    Found:{1}
    ", RENDER_TYPE, RENDER_TYPE); @@ -205,11 +119,96 @@ public class IdeErrorMessages { 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}
    ", - NONE_APPLICABLE_CALLS); + new NoneApplicableCallsRenderer()); MAP.setImmutable(); } private IdeErrorMessages() { } + + private static class NoneApplicableCallsRenderer implements Renderer>> { + @Nullable + private static 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; + } + + private static 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(); + } + } }