From bdf7e924b5131b19ee59b4faa1f98cb93c1aa4a7 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 7 Aug 2014 16:29:12 +0400 Subject: [PATCH] Rendering flexible types with "!" and optional parts --- .../compiledJava/rendering/Rendering.java | 51 +++++++++++++++++ .../compiledJava/rendering/Rendering.txt | 57 +++++++++++++++++++ .../jvm/compiler/LoadJavaTestGenerated.java | 18 +++++- .../jet/renderer/DescriptorRendererImpl.java | 48 +++++++++++++++- 4 files changed, 171 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/loadJava/compiledJava/rendering/Rendering.java create mode 100644 compiler/testData/loadJava/compiledJava/rendering/Rendering.txt diff --git a/compiler/testData/loadJava/compiledJava/rendering/Rendering.java b/compiler/testData/loadJava/compiledJava/rendering/Rendering.java new file mode 100644 index 00000000000..318c1a303a2 --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/rendering/Rendering.java @@ -0,0 +1,51 @@ +package test; + +import java.lang.Integer; +import java.lang.String; +import java.util.*; + +public class Rendering { + + class A_Plain {} + + class B_Super {} + + class C_Sub extends B_Super {} + + class D_SuperG {} + + class E_SubG extends D_SuperG {} + + interface F_Array { + void foo1(String[] strings); + void foo2(List[] strings); + void foo3(Integer... args); + void foo4(String... args); + void foo5(List... args); + } + + interface G_Collections { + void foo1(Iterator x); + void foo2(Iterable x); + void foo3(Collection x); + void foo4(List x); + void foo5(Set x); + void foo6(Map x); + void foo7(Map.Entry x); + } + + interface H_Raw { + void foo1(List x); + void foo2(D_SuperG x); + } + + interface I_Wildcard { + void foo1(List x); + void foo2(List x); + void foo3(List x); + void foo4(D_SuperG x); + void foo5(D_SuperG x); + void foo6(D_SuperG x); + } + +} \ No newline at end of file diff --git a/compiler/testData/loadJava/compiledJava/rendering/Rendering.txt b/compiler/testData/loadJava/compiledJava/rendering/Rendering.txt new file mode 100644 index 00000000000..22828fe041b --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/rendering/Rendering.txt @@ -0,0 +1,57 @@ +package test + +public open class Rendering { + public constructor Rendering() + + public/*package*/ open inner class A_Plain { + public/*package*/ constructor A_Plain() + } + + public/*package*/ open inner class B_Super { + public/*package*/ constructor B_Super() + } + + public/*package*/ open inner class C_Sub : test.Rendering.B_Super { + public/*package*/ constructor C_Sub() + } + + public/*package*/ open inner class D_SuperG { + public/*package*/ constructor D_SuperG() + } + + public/*package*/ open inner class E_SubG : test.Rendering.D_SuperG { + public/*package*/ constructor E_SubG() + } + + public/*package*/ trait F_Array { + public abstract fun foo1(/*0*/ p0: kotlin.Array<(out) kotlin.String!>!): kotlin.Unit + public abstract fun foo2(/*0*/ p0: kotlin.Array<(out) kotlin.(Mutable)List!>!): kotlin.Unit + public abstract fun foo3(/*0*/ vararg p0: kotlin.Int! /*kotlin.Array<(out) kotlin.Int!>!*/): kotlin.Unit + public abstract fun foo4(/*0*/ vararg p0: kotlin.String! /*kotlin.Array<(out) kotlin.String!>!*/): kotlin.Unit + public abstract fun foo5(/*0*/ vararg p0: kotlin.(Mutable)List! /*kotlin.Array<(out) kotlin.(Mutable)List!>!*/): kotlin.Unit + } + + public/*package*/ trait G_Collections { + public abstract fun foo1(/*0*/ p0: kotlin.(Mutable)Iterator!): kotlin.Unit + public abstract fun foo2(/*0*/ p0: kotlin.(Mutable)Iterable!): kotlin.Unit + public abstract fun foo3(/*0*/ p0: kotlin.(Mutable)Collection!): kotlin.Unit + public abstract fun foo4(/*0*/ p0: kotlin.(Mutable)List!): kotlin.Unit + public abstract fun foo5(/*0*/ p0: kotlin.(Mutable)Set!): kotlin.Unit + public abstract fun foo6(/*0*/ p0: kotlin.(Mutable)Map!): kotlin.Unit + public abstract fun foo7(/*0*/ p0: (kotlin.MutableMap.MutableEntry..kotlin.Map.Entry?)): kotlin.Unit + } + + public/*package*/ trait H_Raw { + public abstract fun foo1(/*0*/ p0: (kotlin.MutableList..kotlin.List?)): kotlin.Unit + public abstract fun foo2(/*0*/ p0: test.Rendering.D_SuperG!): kotlin.Unit + } + + public/*package*/ trait I_Wildcard { + public abstract fun foo1(/*0*/ p0: (kotlin.MutableList..kotlin.List?)): kotlin.Unit + public abstract fun foo2(/*0*/ p0: kotlin.(Mutable)List!): kotlin.Unit + public abstract fun foo3(/*0*/ p0: (kotlin.MutableList..kotlin.List?)): kotlin.Unit + public abstract fun foo4(/*0*/ p0: test.Rendering.D_SuperG!): kotlin.Unit + public abstract fun foo5(/*0*/ p0: test.Rendering.D_SuperG!): kotlin.Unit + public abstract fun foo6(/*0*/ p0: test.Rendering.D_SuperG!): kotlin.Unit + } +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java index 960ad6e2704..2e2d891bc81 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java @@ -35,7 +35,7 @@ import java.util.regex.Pattern; public class LoadJavaTestGenerated extends AbstractLoadJavaTest { @TestMetadata("compiler/testData/loadJava/compiledJava") @TestDataPath("$PROJECT_ROOT") - @InnerTestClasses({CompiledJava.Annotations.class, CompiledJava.Constructor.class, CompiledJava.JavaBean.class, CompiledJava.KotlinSignature.class, CompiledJava.Library.class, CompiledJava.Modality.class, CompiledJava.Mutability.class, CompiledJava.NotNull.class, CompiledJava.ProtectedPackage.class, CompiledJava.ProtectedStatic.class, CompiledJava.Sam.class, CompiledJava.SignaturePropagation.class, CompiledJava.Static.class, CompiledJava.Vararg.class}) + @InnerTestClasses({CompiledJava.Annotations.class, CompiledJava.Constructor.class, CompiledJava.JavaBean.class, CompiledJava.KotlinSignature.class, CompiledJava.Library.class, CompiledJava.Modality.class, CompiledJava.Mutability.class, CompiledJava.NotNull.class, CompiledJava.ProtectedPackage.class, CompiledJava.ProtectedStatic.class, CompiledJava.Rendering.class, CompiledJava.Sam.class, CompiledJava.SignaturePropagation.class, CompiledJava.Static.class, CompiledJava.Vararg.class}) @RunWith(org.jetbrains.jet.JUnit3RunnerWithInners.class) public static class CompiledJava extends AbstractLoadJavaTest { public void testAllFilesPresentInCompiledJava() throws Exception { @@ -1400,6 +1400,22 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { } + @TestMetadata("compiler/testData/loadJava/compiledJava/rendering") + @TestDataPath("$PROJECT_ROOT") + @RunWith(org.jetbrains.jet.JUnit3RunnerWithInners.class) + public static class Rendering extends AbstractLoadJavaTest { + public void testAllFilesPresentInRendering() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/loadJava/compiledJava/rendering"), Pattern.compile("^(.+)\\.java$"), true); + } + + @TestMetadata("Rendering.java") + public void testRendering() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/rendering/Rendering.java"); + doTestCompiledJava(fileName); + } + + } + @TestMetadata("compiler/testData/loadJava/compiledJava/sam") @TestDataPath("$PROJECT_ROOT") @InnerTestClasses({Sam.Adapters.class}) diff --git a/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRendererImpl.java b/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRendererImpl.java index a9f71d7a446..6a7a83262f4 100644 --- a/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRendererImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/renderer/DescriptorRendererImpl.java @@ -301,9 +301,14 @@ public class DescriptorRendererImpl implements DescriptorRenderer { } return "???"; } - if (type instanceof FlexibleType && debugMode) { + if (type instanceof FlexibleType) { FlexibleType flexibleType = (FlexibleType) type; - return "(" + renderType(flexibleType.getLowerBound()) + ".." + renderType(flexibleType.getUpperBound()) + ")"; + if (!debugMode) { + return renderFlexibleType(flexibleType); + } + else { + return "(" + renderType(flexibleType.getLowerBound()) + ".." + renderType(flexibleType.getUpperBound()) + ")"; + } } if (type instanceof LazyType && debugMode) { return type.toString(); @@ -317,6 +322,45 @@ public class DescriptorRendererImpl implements DescriptorRenderer { return renderDefaultType(type); } + @NotNull + private String renderFlexibleType(@NotNull FlexibleType type) { + JetType lower = type.getLowerBound(); + JetType upper = type.getUpperBound(); + + String lowerRendered = renderDefaultType(lower); + String upperRendered = renderDefaultType(upper); + + if (differsOnlyInNullability(lowerRendered, upperRendered)) { + return lowerRendered + "!"; + } + + String kotlinPrefix = "kotlin."; + String mutablePrefix = "Mutable"; + // e.g. lower = kotlin.MutableList, upper = kotlin.List? + if (lowerRendered.startsWith(kotlinPrefix + mutablePrefix)) { + // List + String lowerWithoutPrefix = lowerRendered.substring(mutablePrefix.length() + kotlinPrefix.length()); + if (differsOnlyInNullability(lowerWithoutPrefix, upperRendered.substring(kotlinPrefix.length()))) { + return kotlinPrefix + "(" + mutablePrefix + ")" + lowerWithoutPrefix + "!"; + } + } + else { + String arrayPrefix = "kotlin.Array<"; + String covariantArrayPrefix = "kotlin.Array typeArguments) {