From 3af2b1b80a8897d043eb986b90ce9a9b0d3e61a1 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Fri, 11 May 2012 18:24:58 +0400 Subject: [PATCH] improve rendering of upper bounds --- .../jet/resolve/DescriptorRenderer.java | 59 +++++++++++++++---- compiler/testData/renderer/GlobalFunctions.kt | 11 +++- 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index 1f0b5c90416..d18b2c2c768 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -80,7 +80,7 @@ public class DescriptorRenderer implements Renderer { private final DeclarationDescriptorVisitor 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 { 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 { 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 { @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 { 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 { 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" + } } } } diff --git a/compiler/testData/renderer/GlobalFunctions.kt b/compiler/testData/renderer/GlobalFunctions.kt index b2226aa8547..4b92a1bd4f4 100644 --- a/compiler/testData/renderer/GlobalFunctions.kt +++ b/compiler/testData/renderer/GlobalFunctions.kt @@ -12,6 +12,11 @@ public fun Int.ext() : Int {} public fun withTypeParam(a : Array) : Int {} +trait Foo +trait Bar + +fun

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 withTypeParam(a : Array) : Int {} //public final fun jet.Int.ext() : jet.Int defined in rendererTest //public final fun withTypeParam(a : jet.Array) : jet.Int defined in rendererTest // defined in rendererTest.withTypeParam -//value-parameter val a : jet.Array defined in rendererTest.withTypeParam \ No newline at end of file +//value-parameter val a : jet.Array defined in rendererTest.withTypeParam +//internal trait Foo defined in rendererTest +//internal trait Bar defined in rendererTest +//internal final fun

funTypeParameterWithTwoUpperBounds() : jet.Int where P : rendererTest.Foo, P : rendererTest.Bar defined in rendererTest +//

defined in rendererTest.funTypeParameterWithTwoUpperBounds