improve rendering of upper bounds
This commit is contained in:
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user