Refactoring: extract NONE_APPLICABLE renderer

This commit is contained in:
Natalia.Ukhorskaya
2013-04-16 16:01:34 +04:00
parent a9b4a342e7
commit b484ce711f
2 changed files with 83 additions and 83 deletions
@@ -91,12 +91,12 @@ public class IdeErrorMessages {
MAP.put(OVERLOAD_RESOLUTION_AMBIGUITY, "<html>Overload resolution ambiguity. All these functions match. <ul>{0}</ul></html>", HTML_AMBIGUOUS_CALLS);
MAP.put(NONE_APPLICABLE, "<html>None of the following functions can be called with the arguments supplied. <ul>{0}</ul></html>",
new NoneApplicableCallsRenderer());
HTML_NONE_APPLICABLE_CALLS);
MAP.put(CANNOT_COMPLETE_RESOLVE, "<html>Cannot choose among the following candidates without completing type inference: <ul>{0}</ul></html>", HTML_AMBIGUOUS_CALLS);
MAP.put(DELEGATE_SPECIAL_FUNCTION_AMBIGUITY, "<html>Overload resolution ambiguity on method ''{0}''. All these functions match. <ul>{1}</ul></html>", TO_STRING, HTML_AMBIGUOUS_CALLS);
MAP.put(DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE, "<html>Property delegate must have a ''{0}'' method. None of the following functions is suitable. <ul>{1}</ul></html>",
TO_STRING, new NoneApplicableCallsRenderer());
TO_STRING, HTML_NONE_APPLICABLE_CALLS);
MAP.setImmutable();
}
@@ -84,95 +84,95 @@ public class IdeRenderers {
}
};
public static class NoneApplicableCallsRenderer implements Renderer<Collection<? extends ResolvedCall<?>>> {
@Nullable
private static ValueParameterDescriptor findParameterByArgumentExpression(
ResolvedCall<? extends CallableDescriptor> call,
JetValueArgument argument) {
for (Map.Entry<ValueParameterDescriptor, ResolvedValueArgument> entry : call.getValueArguments().entrySet()) {
for (ValueArgument va : entry.getValue().getArguments()) {
if (va == argument) {
return entry.getKey();
}
}
}
return null;
}
private static Set<ValueParameterDescriptor> getParametersToHighlight(ResolvedCall<? extends CallableDescriptor> call) {
Set<ValueParameterDescriptor> parameters = new HashSet<ValueParameterDescriptor>();
if (call instanceof ResolvedCallImpl) {
Collection<Diagnostic> diagnostics = ((ResolvedCallImpl)call).getTrace().getBindingContext().getDiagnostics();
for (Diagnostic diagnostic : diagnostics) {
if (diagnostic.getFactory() == Errors.TOO_MANY_ARGUMENTS) {
parameters.add(null);
} else if (diagnostic.getFactory() == Errors.NO_VALUE_FOR_PARAMETER) {
ValueParameterDescriptor parameter =
((DiagnosticWithParameters1<PsiElement, ValueParameterDescriptor>)diagnostic).getA();
parameters.add(parameter);
} else {
JetValueArgument argument = PsiTreeUtil.getParentOfType(diagnostic.getPsiElement(), JetValueArgument.class, false);
if (argument != null) {
ValueParameterDescriptor parameter = findParameterByArgumentExpression(call, argument);
if (parameter != null) {
parameters.add(parameter);
public static final Renderer<Collection<? extends ResolvedCall<?>>> HTML_NONE_APPLICABLE_CALLS =
new Renderer<Collection<? extends ResolvedCall<? extends CallableDescriptor>>>() {
@Nullable
private ValueParameterDescriptor findParameterByArgumentExpression(
ResolvedCall<? extends CallableDescriptor> call,
JetValueArgument argument) {
for (Map.Entry<ValueParameterDescriptor, ResolvedValueArgument> entry : call.getValueArguments().entrySet()) {
for (ValueArgument va : entry.getValue().getArguments()) {
if (va == argument) {
return entry.getKey();
}
}
}
return null;
}
}
return parameters;
}
@NotNull
@Override
public String render(@NotNull Collection<? extends ResolvedCall<? extends CallableDescriptor>> calls) {
StringBuilder stringBuilder = new StringBuilder("");
for (ResolvedCall<? extends CallableDescriptor> call : calls) {
stringBuilder.append("<li>");
CallableDescriptor funDescriptor = call.getResultingDescriptor();
Set<ValueParameterDescriptor> parametersToHighlight = getParametersToHighlight(call);
private Set<ValueParameterDescriptor> getParametersToHighlight(ResolvedCall<? extends CallableDescriptor> call) {
Set<ValueParameterDescriptor> parameters = new HashSet<ValueParameterDescriptor>();
if (call instanceof ResolvedCallImpl) {
Collection<Diagnostic> diagnostics = ((ResolvedCallImpl)call).getTrace().getBindingContext().getDiagnostics();
for (Diagnostic diagnostic : diagnostics) {
if (diagnostic.getFactory() == Errors.TOO_MANY_ARGUMENTS) {
parameters.add(null);
} else if (diagnostic.getFactory() == Errors.NO_VALUE_FOR_PARAMETER) {
ValueParameterDescriptor parameter =
((DiagnosticWithParameters1<PsiElement, ValueParameterDescriptor>)diagnostic).getA();
parameters.add(parameter);
} else {
JetValueArgument argument = PsiTreeUtil.getParentOfType(diagnostic.getPsiElement(), JetValueArgument.class, false);
if (argument != null) {
ValueParameterDescriptor parameter = findParameterByArgumentExpression(call, argument);
if (parameter != null) {
parameters.add(parameter);
}
}
}
}
}
return parameters;
}
DescriptorRenderer htmlRenderer = DescriptorRenderer.HTML;
ReceiverParameterDescriptor receiverParameter = funDescriptor.getReceiverParameter();
if (receiverParameter != null) {
stringBuilder.append(htmlRenderer.renderType(receiverParameter.getType())).append(".");
}
stringBuilder.append(funDescriptor.getName()).append("(");
boolean first = true;
for (ValueParameterDescriptor parameter : funDescriptor.getValueParameters()) {
if (!first) {
stringBuilder.append(", ");
}
JetType type = parameter.getType();
JetType varargElementType = parameter.getVarargElementType();
if (varargElementType != null) {
type = varargElementType;
}
String paramString = (varargElementType != null ? "<b>vararg</b> " : "") + htmlRenderer.renderType(type);
if (parameter.hasDefaultValue()) {
paramString += " = ...";
}
if (parametersToHighlight.contains(parameter)) {
paramString = String.format(RED_TEMPLATE, paramString);
}
stringBuilder.append(paramString);
@NotNull
@Override
public String render(@NotNull Collection<? extends ResolvedCall<? extends CallableDescriptor>> calls) {
StringBuilder stringBuilder = new StringBuilder("");
for (ResolvedCall<? extends CallableDescriptor> call : calls) {
stringBuilder.append("<li>");
CallableDescriptor funDescriptor = call.getResultingDescriptor();
Set<ValueParameterDescriptor> parametersToHighlight = getParametersToHighlight(call);
first = false;
DescriptorRenderer htmlRenderer = DescriptorRenderer.HTML;
ReceiverParameterDescriptor receiverParameter = funDescriptor.getReceiverParameter();
if (receiverParameter != null) {
stringBuilder.append(htmlRenderer.renderType(receiverParameter.getType())).append(".");
}
stringBuilder.append(funDescriptor.getName()).append("(");
boolean first = true;
for (ValueParameterDescriptor parameter : funDescriptor.getValueParameters()) {
if (!first) {
stringBuilder.append(", ");
}
JetType type = parameter.getType();
JetType varargElementType = parameter.getVarargElementType();
if (varargElementType != null) {
type = varargElementType;
}
String paramString = (varargElementType != null ? "<b>vararg</b> " : "") + htmlRenderer.renderType(type);
if (parameter.hasDefaultValue()) {
paramString += " = ...";
}
if (parametersToHighlight.contains(parameter)) {
paramString = String.format(RED_TEMPLATE, paramString);
}
stringBuilder.append(paramString);
first = false;
}
stringBuilder.append(parametersToHighlight.contains(null) ? String.format(RED_TEMPLATE, ")") : ")");
stringBuilder.append(" <i>defined in</i> ");
DeclarationDescriptor containingDeclaration = funDescriptor.getContainingDeclaration();
if (containingDeclaration != null) {
FqNameUnsafe fqName = DescriptorUtils.getFQName(containingDeclaration);
stringBuilder.append(FqName.ROOT.equalsTo(fqName) ? "root package" : fqName.getFqName());
}
stringBuilder.append("</li>");
}
return stringBuilder.toString();
}
stringBuilder.append(parametersToHighlight.contains(null) ? String.format(RED_TEMPLATE, ")") : ")");
stringBuilder.append(" <i>defined in</i> ");
DeclarationDescriptor containingDeclaration = funDescriptor.getContainingDeclaration();
if (containingDeclaration != null) {
FqNameUnsafe fqName = DescriptorUtils.getFQName(containingDeclaration);
stringBuilder.append(FqName.ROOT.equalsTo(fqName) ? "root package" : fqName.getFqName());
}
stringBuilder.append("</li>");
}
return stringBuilder.toString();
}
}
};
public static final Renderer<ExtendedInferenceErrorData> HTML_TYPE_INFERENCE_CONFLICTING_SUBSTITUTIONS_RENDERER =
new Renderer<ExtendedInferenceErrorData>() {