improve rendering of upper bounds

This commit is contained in:
Stepan Koltsov
2012-05-11 18:24:58 +04:00
parent 9a05af1757
commit 3af2b1b80a
2 changed files with 59 additions and 11 deletions
@@ -80,7 +80,7 @@ public class DescriptorRenderer implements Renderer<DeclarationDescriptor> {
private final DeclarationDescriptorVisitor<Void, StringBuilder> subVisitor = new RenderDeclarationDescriptorVisitor() {
@Override
public Void visitTypeParameterDescriptor(TypeParameterDescriptor descriptor, StringBuilder builder) {
renderTypeParameter(descriptor, builder);
renderTypeParameter(descriptor, builder, false);
return null;
}
@@ -388,6 +388,7 @@ public class DescriptorRenderer implements Renderer<DeclarationDescriptor> {
renderName(descriptor, builder);
renderValueParameters(descriptor, builder);
builder.append(" : ").append(escape(renderType(descriptor.getReturnType())));
renderWhereSuffix(descriptor, builder);
return null;
}
@@ -403,6 +404,28 @@ public class DescriptorRenderer implements Renderer<DeclarationDescriptor> {
builder.append(")");
}
private void renderWhereSuffix(@NotNull CallableMemberDescriptor callable, @NotNull StringBuilder builder) {
boolean first = true;
for (TypeParameterDescriptor typeParameter : callable.getTypeParameters()) {
if (typeParameter.getUpperBounds().size() > 1) {
for (JetType upperBound : typeParameter.getUpperBounds()) {
if (first) {
builder.append(" ");
builder.append(renderKeyword("where"));
builder.append(" ");
}
else {
builder.append(", ");
}
builder.append(typeParameter.getName());
builder.append(" : ");
builder.append(escape(renderType(upperBound)));
first = false;
}
}
}
}
@Override
public Void visitConstructorDescriptor(ConstructorDescriptor constructorDescriptor, StringBuilder builder) {
builder.append(renderKeyword("ctor")).append(" ");
@@ -434,7 +457,7 @@ public class DescriptorRenderer implements Renderer<DeclarationDescriptor> {
@Override
public Void visitTypeParameterDescriptor(TypeParameterDescriptor descriptor, StringBuilder builder) {
builder.append(lt());
renderTypeParameter(descriptor, builder);
renderTypeParameter(descriptor, builder, true);
builder.append(">");
return null;
}
@@ -513,7 +536,7 @@ public class DescriptorRenderer implements Renderer<DeclarationDescriptor> {
stringBuilder.append(escape(descriptor.getName()));
}
protected void renderTypeParameter(TypeParameterDescriptor descriptor, StringBuilder builder) {
protected void renderTypeParameter(TypeParameterDescriptor descriptor, StringBuilder builder, boolean topLevel) {
if (descriptor.isReified()) {
String variance = descriptor.getVariance().toString();
if (!variance.isEmpty()) {
@@ -524,15 +547,31 @@ public class DescriptorRenderer implements Renderer<DeclarationDescriptor> {
builder.append(renderKeyword("erased")).append(" ");
}
renderName(descriptor, builder);
if (!descriptor.getUpperBounds().isEmpty()) {
JetType bound = descriptor.getUpperBounds().iterator().next();
if (bound != JetStandardClasses.getDefaultBound()) {
builder.append(" : ").append(renderType(bound));
if (descriptor.getUpperBounds().size() > 1) {
builder.append(" (...)");
}
if (descriptor.getUpperBounds().size() == 1) {
JetType upperBound = descriptor.getUpperBounds().iterator().next();
if (upperBound != JetStandardClasses.getDefaultBound()) {
builder.append(" : ").append(renderType(upperBound));
}
}
else if (topLevel) {
boolean first = true;
for (JetType upperBound : descriptor.getUpperBounds()) {
if (upperBound.equals(JetStandardClasses.getDefaultBound())) {
continue;
}
if (first) {
builder.append(" : ");
}
else {
builder.append(" & ");
}
builder.append(renderType(upperBound));
first = false;
}
}
else {
// rendered with "where"
}
}
}
}
+10 -1
View File
@@ -12,6 +12,11 @@ public fun Int.ext() : Int {}
public fun <out T> withTypeParam(a : Array<T>) : Int {}
trait Foo
trait Bar
fun <P> funTypeParameterWithTwoUpperBounds() where P : Foo, P : Bar = 17
//package rendererTest defined in root package
//public final fun pub() : Unit defined in rendererTest
//internal final fun int() : jet.String defined in rendererTest
@@ -23,4 +28,8 @@ public fun <out T> withTypeParam(a : Array<T>) : Int {}
//public final fun jet.Int.ext() : jet.Int defined in rendererTest
//public final fun <out T> withTypeParam(a : jet.Array<T>) : jet.Int defined in rendererTest
//<out T> defined in rendererTest.withTypeParam
//value-parameter val a : jet.Array<T> defined in rendererTest.withTypeParam
//value-parameter val a : jet.Array<T> defined in rendererTest.withTypeParam
//internal trait Foo defined in rendererTest
//internal trait Bar defined in rendererTest
//internal final fun <P> funTypeParameterWithTwoUpperBounds() : jet.Int where P : rendererTest.Foo, P : rendererTest.Bar defined in rendererTest
//<P : rendererTest.Foo & rendererTest.Bar> defined in rendererTest.funTypeParameterWithTwoUpperBounds