From b5f89c661abbc29c644f132c13eae813e60d9c2f Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 17 Oct 2014 12:59:40 +0400 Subject: [PATCH] DescriptorRenderer can now render flexible types for code (i.e. `ft`) --- .../jet/renderer/DescriptorRenderer.java | 4 +++ .../renderer/DescriptorRendererBuilder.java | 8 +++++- .../jet/renderer/DescriptorRendererImpl.java | 28 +++++++++++++++---- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRenderer.java b/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRenderer.java index f55f8748a7f..a70dac46d34 100644 --- a/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRenderer.java +++ b/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRenderer.java @@ -62,6 +62,10 @@ public interface DescriptorRenderer extends Renderer { DescriptorRenderer DEBUG_TEXT = new DescriptorRendererBuilder().setDebugMode(true).build(); + DescriptorRenderer FLEXIBLE_TYPES_FOR_CODE = new DescriptorRendererBuilder() + .setFlexibleTypesForCode(true) + .build(); + DescriptorRenderer HTML_COMPACT_WITH_MODIFIERS = new DescriptorRendererBuilder() .setWithDefinedIn(false) .setTextFormat(TextFormat.HTML).build(); diff --git a/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRendererBuilder.java b/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRendererBuilder.java index 3551ad97741..79dd71c04d2 100644 --- a/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRendererBuilder.java +++ b/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRendererBuilder.java @@ -52,6 +52,7 @@ public class DescriptorRendererBuilder { } }; private boolean renderDefaultValues = true; + private boolean flexibleTypesForCode = false; @NotNull private DescriptorRenderer.OverrideRenderingPolicy overrideRenderingPolicy = DescriptorRenderer.OverrideRenderingPolicy.RENDER_OPEN; @@ -221,6 +222,11 @@ public class DescriptorRendererBuilder { return this; } + public DescriptorRendererBuilder setFlexibleTypesForCode(boolean flexibleTypesForCode) { + this.flexibleTypesForCode = flexibleTypesForCode; + return this; + } + @NotNull public DescriptorRenderer build() { return new DescriptorRendererImpl( @@ -228,7 +234,7 @@ public class DescriptorRendererBuilder { normalizedVisibilities, showInternalKeyword, prettyFunctionTypes, uninferredTypeParameterAsName, overrideRenderingPolicy, valueParametersHandler, textFormat, excludedAnnotationClasses, includePropertyConstant, includeSynthesizedParameterNames, withoutFunctionParameterNames, withoutTypeParameters, receiverAfterName, - renderClassObjectName, withoutSuperTypes, typeNormalizer, renderDefaultValues); + renderClassObjectName, withoutSuperTypes, typeNormalizer, renderDefaultValues, flexibleTypesForCode); } } diff --git a/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRendererImpl.java b/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRendererImpl.java index bc479450983..be7d7c77cb5 100644 --- a/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRendererImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRendererImpl.java @@ -46,6 +46,7 @@ import static org.jetbrains.jet.lang.types.TypeUtils.CANT_INFER_LAMBDA_PARAM_TYP import static org.jetbrains.jet.lang.types.TypeUtils.DONT_CARE; public class DescriptorRendererImpl implements DescriptorRenderer { + private final Function1 typeNormalizer; private final boolean shortNames; private final boolean withDefinedIn; @@ -66,6 +67,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer { private final boolean withoutSuperTypes; private final boolean receiverAfterName; private final boolean renderDefaultValues; + private final boolean flexibleTypesForCode; @NotNull private final OverrideRenderingPolicy overrideRenderingPolicy; @@ -102,7 +104,8 @@ public class DescriptorRendererImpl implements DescriptorRenderer { boolean renderClassObjectName, boolean withoutSuperTypes, @NotNull Function1 typeNormalizer, - boolean renderDefaultValues + boolean renderDefaultValues, + boolean flexibleTypesForCode ) { this.shortNames = shortNames; this.withDefinedIn = withDefinedIn; @@ -129,6 +132,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer { this.withoutSuperTypes = withoutSuperTypes; this.typeNormalizer = typeNormalizer; this.renderDefaultValues = renderDefaultValues; + this.flexibleTypesForCode = flexibleTypesForCode; } /* FORMATTING */ @@ -305,17 +309,29 @@ public class DescriptorRendererImpl implements DescriptorRenderer { @NotNull private String renderNormalizedType(@NotNull JetType type) { if (TypesPackage.isFlexible(type)) { - if (!debugMode) { - return renderFlexibleType(type); + if (debugMode) { + return renderFlexibleTypeWithBothBounds(TypesPackage.flexibility(type).getLowerBound(), + TypesPackage.flexibility(type).getUpperBound()); + } + else if (flexibleTypesForCode) { + String prefix = shortNames ? "" : Flexibility.FLEXIBLE_TYPE_CLASSIFIER.getPackageFqName().asString() + "."; + return prefix + Flexibility.FLEXIBLE_TYPE_CLASSIFIER.getRelativeClassName() + + lt() + + renderNormalizedType(TypesPackage.flexibility(type).getLowerBound()) + ", " + + renderNormalizedType(TypesPackage.flexibility(type).getUpperBound()) + + gt(); } else { - return "(" + renderNormalizedType(TypesPackage.flexibility(type).getLowerBound()) + ".." + - renderNormalizedType(TypesPackage.flexibility(type).getUpperBound()) + ")"; + return renderFlexibleType(type); } } return renderInflexibleType(type); } + private String renderFlexibleTypeWithBothBounds(@NotNull JetType lower, @NotNull JetType upper) { + return "(" + renderNormalizedType(lower) + ".." + renderNormalizedType(upper) + ")"; + } + private String renderInflexibleType(@NotNull JetType type) { assert !TypesPackage.isFlexible(type) : "Flexible types not allowed here: " + renderNormalizedType(type); @@ -376,7 +392,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer { kotlinPrefix + escape("Array<(out) ") ); if (array != null) return array; - return "(" + renderNormalizedType(lower) + ".." + renderNormalizedType(upper) + ")"; + return renderFlexibleTypeWithBothBounds(lower, upper); } @Nullable