Simplified HtmlTabledDescriptorRenderer.

Got rid of suspicious subclassing with overriding protected methods: passing ValueParametersHandler instead.
This commit is contained in:
Evgeny Gerashchenko
2012-12-13 20:40:41 +04:00
parent 0f38e3f1fc
commit 9947bff2e1
2 changed files with 88 additions and 62 deletions
@@ -110,13 +110,20 @@ public class DescriptorRendererImpl implements Renderer<DeclarationDescriptor> {
private final RenderDeclarationDescriptorVisitor rootVisitor = new RenderDeclarationDescriptorVisitor(); private final RenderDeclarationDescriptorVisitor rootVisitor = new RenderDeclarationDescriptorVisitor();
private final boolean shortNames; private final boolean shortNames;
@Nullable
private final ValueParametersHandler handler;
public DescriptorRendererImpl() { public DescriptorRendererImpl() {
this(false); this(false, null);
} }
public DescriptorRendererImpl(boolean shortNames) { public DescriptorRendererImpl(boolean shortNames) {
this(shortNames, null);
}
public DescriptorRendererImpl(boolean shortNames, @Nullable ValueParametersHandler handler) {
this.shortNames = shortNames; this.shortNames = shortNames;
this.handler = handler;
} }
protected boolean hasDefaultValue(ValueParameterDescriptor descriptor) { protected boolean hasDefaultValue(ValueParameterDescriptor descriptor) {
@@ -301,33 +308,36 @@ public class DescriptorRendererImpl implements Renderer<DeclarationDescriptor> {
return s; return s;
} }
protected void renderValueParameters(FunctionDescriptor descriptor, StringBuilder builder) { private void renderValueParameters(FunctionDescriptor function, StringBuilder builder) {
if (descriptor.getValueParameters().isEmpty()) { if (handler != null) {
renderEmptyValueParameters(builder); handler.appendBeforeValueParameters(function, builder);
} for (ValueParameterDescriptor parameter : function.getValueParameters()) {
for (Iterator<ValueParameterDescriptor> iterator = descriptor.getValueParameters().iterator(); iterator.hasNext(); ) { handler.appendBeforeValueParameter(parameter, builder);
renderValueParameter(iterator.next(), !iterator.hasNext(), builder); parameter.accept(subVisitor, builder);
} handler.appendAfterValueParameter(parameter, builder);
} }
handler.appendAfterValueParameters(function, builder);
protected void renderEmptyValueParameters(StringBuilder builder) {
builder.append("()");
}
protected void renderValueParameter(ValueParameterDescriptor parameterDescriptor, boolean isLast, StringBuilder builder) {
if (parameterDescriptor.getIndex() == 0) {
builder.append("(");
}
parameterDescriptor.accept(subVisitor, builder);
if (!isLast) {
builder.append(", ");
} }
else { else {
builder.append("(");
for (ValueParameterDescriptor parameter : function.getValueParameters()) {
parameter.accept(subVisitor, builder);
if (parameter.getIndex() != function.getValueParameters().size() - 1) {
builder.append(", ");
}
}
builder.append(")"); builder.append(")");
} }
} }
public static class HtmlDescriptorRendererImpl extends DescriptorRendererImpl { public static class HtmlDescriptorRendererImpl extends DescriptorRendererImpl {
public HtmlDescriptorRendererImpl() {
super();
}
public HtmlDescriptorRendererImpl(boolean shortNames, @Nullable ValueParametersHandler handler) {
super(shortNames, handler);
}
@Override @Override
protected String escape(String s) { protected String escape(String s) {
@@ -671,4 +681,18 @@ public class DescriptorRendererImpl implements Renderer<DeclarationDescriptor> {
} }
} }
} }
public interface ValueParametersHandler {
// by default, renders "("
void appendBeforeValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder);
// by default, renders ")"
void appendAfterValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder);
// by default, renders nothing
void appendBeforeValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder);
// by default, renders ", " if its not last parameter
void appendAfterValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder);
}
} }
@@ -19,11 +19,12 @@ package org.jetbrains.jet.plugin.highlighter;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.diagnostics.rendering.TabledDescriptorRenderer; import org.jetbrains.jet.lang.diagnostics.rendering.TabledDescriptorRenderer;
import org.jetbrains.jet.lang.diagnostics.rendering.TabledDescriptorRenderer.TableRenderer.*; import org.jetbrains.jet.lang.diagnostics.rendering.TabledDescriptorRenderer.TableRenderer.DescriptorRow;
import org.jetbrains.jet.lang.diagnostics.rendering.TabledDescriptorRenderer.TableRenderer.FunctionArgumentsRow;
import org.jetbrains.jet.lang.diagnostics.rendering.TabledDescriptorRenderer.TableRenderer.TableRow;
import org.jetbrains.jet.lang.resolve.calls.inference.ConstraintPosition; import org.jetbrains.jet.lang.resolve.calls.inference.ConstraintPosition;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.renderer.DescriptorRendererImpl; import org.jetbrains.jet.renderer.DescriptorRendererImpl;
@@ -94,7 +95,8 @@ public class HtmlTabledDescriptorRenderer extends TabledDescriptorRenderer {
tdColspan(result, rowText.toString(), rowsNumber); tdColspan(result, rowText.toString(), rowsNumber);
} }
if (row instanceof DescriptorRow) { if (row instanceof DescriptorRow) {
result.append(DESCRIPTOR_IN_TABLE.render(((DescriptorRow) row).descriptor)); tdSpace(result);
tdRightBoldColspan(result, 2, DESCRIPTOR_IN_TABLE.render(((DescriptorRow) row).descriptor));
} }
if (row instanceof FunctionArgumentsRow) { if (row instanceof FunctionArgumentsRow) {
FunctionArgumentsRow functionArgumentsRow = (FunctionArgumentsRow) row; FunctionArgumentsRow functionArgumentsRow = (FunctionArgumentsRow) row;
@@ -149,54 +151,54 @@ public class HtmlTabledDescriptorRenderer extends TabledDescriptorRenderer {
super(); super();
} }
public static final DescriptorRendererImpl DESCRIPTOR_IN_TABLE = new DescriptorRendererImpl.HtmlDescriptorRendererImpl() { public static final DescriptorRendererImpl.ValueParametersHandler RENDERER_HANDLER = new DescriptorRendererImpl.ValueParametersHandler() {
@Override @Override
protected boolean shouldRenderDefinedIn() { public void appendBeforeValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder) {
return false; stringBuilder.append("<td align=\"right\"><div style=\"white-space:nowrap;font-weight:bold;\">");
} }
@Override @Override
protected boolean shouldRenderModifiers() { public void appendAfterValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder) {
return false; boolean last = ((FunctionDescriptor) parameter.getContainingDeclaration()).getValueParameters().size() - 1 == parameter.getIndex();
} if (!last) {
stringBuilder.append(",");
@NotNull
@Override
public String render(@NotNull DeclarationDescriptor declarationDescriptor) {
StringBuilder builder = new StringBuilder();
tdSpace(builder);
tdRightBoldColspan(builder, 2, super.render(declarationDescriptor));
return builder.toString();
}
@Override
protected void renderValueParameters(FunctionDescriptor descriptor, StringBuilder builder) {
//todo comment
builder.append("</div></td>");
super.renderValueParameters(descriptor, builder);
builder.append("<td><div style=\"white-space:nowrap;font-weight:bold;\">");
}
@Override
protected void renderEmptyValueParameters(StringBuilder builder) {
tdBold(builder, "( )");
}
@Override
protected void renderValueParameter(ValueParameterDescriptor parameterDescriptor, boolean isLast, StringBuilder builder) {
if (parameterDescriptor.getIndex() == 0) {
tdBold(builder, "(");
} }
StringBuilder parameterBuilder = new StringBuilder(); stringBuilder.append("</div></td>");
parameterDescriptor.accept(super.subVisitor, parameterBuilder); }
tdRightBold(builder, parameterBuilder.toString() + (isLast ? "" : ",")); @Override
if (isLast) { public void appendBeforeValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder) {
tdBold(builder, ")"); stringBuilder.append("</div></td>");
if (function.getValueParameters().isEmpty()) {
tdBold(stringBuilder, "( )");
} }
else {
tdBold(stringBuilder, "(");
}
}
@Override
public void appendAfterValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder) {
if (!function.getValueParameters().isEmpty()) {
tdBold(stringBuilder, ")");
}
stringBuilder.append("<td><div style=\"white-space:nowrap;font-weight:bold;\">");
} }
}; };
public static final DescriptorRendererImpl DESCRIPTOR_IN_TABLE =
new DescriptorRendererImpl.HtmlDescriptorRendererImpl(false, RENDERER_HANDLER) {
@Override
protected boolean shouldRenderDefinedIn() {
return false;
}
@Override
protected boolean shouldRenderModifiers() {
return false;
}
};
private static void td(StringBuilder builder, String text) { private static void td(StringBuilder builder, String text) {
builder.append("<td><div style=\"white-space:nowrap;\">").append(text).append("</div></td>"); builder.append("<td><div style=\"white-space:nowrap;\">").append(text).append("</div></td>");
} }