From bb364cd3935391762678e4029fadc3adb34e0d59 Mon Sep 17 00:00:00 2001 From: Yakov Zaytsev Date: Fri, 19 Jul 2013 14:26:16 +0400 Subject: [PATCH] KT-3771 Fixed --- .../jet/codegen/state/JetTypeMapper.java | 42 ++++++++++++++++--- .../codegen/boxWithStdlib/arrays/kt3771.kt | 14 +++++++ .../testData/writeSignature/ArrayOfInt.kt | 2 +- ...lackBoxWithStdlibCodegenTestGenerated.java | 16 ++++++- 4 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/codegen/boxWithStdlib/arrays/kt3771.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index cb1dbc1145a..cd7427c4c2b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -219,7 +219,7 @@ public class JetTypeMapper extends BindingTraceAware { @NotNull public Type mapType(@NotNull JetType jetType, @Nullable BothSignatureWriter signatureVisitor, @NotNull JetTypeMapperMode kind) { - return mapType(jetType, signatureVisitor, kind, Variance.INVARIANT); + return mapType(jetType, signatureVisitor, kind, Variance.INVARIANT, false); } @NotNull @@ -227,7 +227,17 @@ public class JetTypeMapper extends BindingTraceAware { @NotNull JetType jetType, @Nullable BothSignatureWriter signatureVisitor, @NotNull JetTypeMapperMode kind, - @NotNull Variance howThisTypeIsUsed + @NotNull Variance howThisTypeIsUsed) { + return mapType(jetType, signatureVisitor, kind, howThisTypeIsUsed, false); + } + + @NotNull + public Type mapType( + @NotNull JetType jetType, + @Nullable BothSignatureWriter signatureVisitor, + @NotNull JetTypeMapperMode kind, + @NotNull Variance howThisTypeIsUsed, + boolean arrayParameter ) { Type known = null; DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor(); @@ -243,7 +253,7 @@ public class JetTypeMapper extends BindingTraceAware { return mapKnownAsmType(jetType, known, signatureVisitor, howThisTypeIsUsed); } else if (kind == JetTypeMapperMode.TYPE_PARAMETER) { - return mapKnownAsmType(jetType, boxType(known), signatureVisitor, howThisTypeIsUsed); + return mapKnownAsmType(jetType, boxType(known), signatureVisitor, howThisTypeIsUsed, arrayParameter); } else if (kind == JetTypeMapperMode.TRAIT_IMPL) { throw new IllegalStateException("TRAIT_IMPL is not possible for " + jetType); @@ -291,7 +301,7 @@ public class JetTypeMapper extends BindingTraceAware { if (signatureVisitor != null) { signatureVisitor.writeArrayType(jetType.isNullable(), memberProjection.getProjectionKind()); - mapType(memberType, signatureVisitor, JetTypeMapperMode.TYPE_PARAMETER); + mapType(memberType, signatureVisitor, JetTypeMapperMode.TYPE_PARAMETER, memberProjection.getProjectionKind(), true); signatureVisitor.writeArrayEnd(); } @@ -408,10 +418,24 @@ public class JetTypeMapper extends BindingTraceAware { Type asmType, @Nullable BothSignatureWriter signatureVisitor, @NotNull Variance howThisTypeIsUsed + ) { + return mapKnownAsmType(jetType, asmType, signatureVisitor, howThisTypeIsUsed, false); + } + + private Type mapKnownAsmType( + JetType jetType, + Type asmType, + @Nullable BothSignatureWriter signatureVisitor, + @NotNull Variance howThisTypeIsUsed, + boolean arrayParameter ) { if (signatureVisitor != null) { if (jetType.getArguments().isEmpty()) { - String kotlinTypeName = getKotlinTypeNameForSignature(jetType, asmType); + if (arrayParameter + && (howThisTypeIsUsed == Variance.IN_VARIANCE)) { + asmType = AsmTypeConstants.OBJECT_TYPE; + } + String kotlinTypeName = getKotlinTypeNameForSignature(jetType, asmType, arrayParameter); signatureVisitor.writeAsmType(asmType, jetType.isNullable(), kotlinTypeName); } else { @@ -424,12 +448,18 @@ public class JetTypeMapper extends BindingTraceAware { @Nullable private static String getKotlinTypeNameForSignature(@NotNull JetType jetType, @NotNull Type asmType) { + return getKotlinTypeNameForSignature(jetType, asmType, false); + } + + @Nullable + private static String getKotlinTypeNameForSignature(@NotNull JetType jetType, @NotNull Type asmType, boolean arrayParameter) { ClassifierDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor(); if (descriptor == null) return null; if (asmType.getSort() != Type.OBJECT) return null; JvmClassName jvmClassName = JvmClassName.byType(asmType); - if (JavaToKotlinClassMap.getInstance().mapPlatformClass(jvmClassName.getFqName()).size() > 1) { + if ((arrayParameter && JavaToKotlinClassMap.getInstance().mapPlatformClass(jvmClassName.getFqName()).size() >= 1) + || ((!arrayParameter) && JavaToKotlinClassMap.getInstance().mapPlatformClass(jvmClassName.getFqName()).size() > 1)) { return JvmClassName.byClassDescriptor(descriptor).getSignatureName(); } return null; diff --git a/compiler/testData/codegen/boxWithStdlib/arrays/kt3771.kt b/compiler/testData/codegen/boxWithStdlib/arrays/kt3771.kt new file mode 100644 index 00000000000..9341b533e86 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/arrays/kt3771.kt @@ -0,0 +1,14 @@ +fun fill(dest : Array, v : String) { + dest[0] = v +} + +fun box() : String { +//fun main(args : Array) { + val s : String = "bar" + val any : Array = array(1, "foo", 1.234) + fill(any, s) + /* shouldn't throw +ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String; + */ + return "OK" +} diff --git a/compiler/testData/writeSignature/ArrayOfInt.kt b/compiler/testData/writeSignature/ArrayOfInt.kt index cba50792681..6401af29b7b 100644 --- a/compiler/testData/writeSignature/ArrayOfInt.kt +++ b/compiler/testData/writeSignature/ArrayOfInt.kt @@ -3,4 +3,4 @@ fun never(): Array = throw Exception() // method: _DefaultPackage::never // jvm signature: ()[Ljava/lang/Integer; // generic signature: null -// kotlin signature: ()[Ljava/lang/Integer; // TODO: need to skip kotlin signature +// kotlin signature: ()[Ljet/Int; // TODO: need to skip kotlin signature diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index 24e69e94441..5d2e99c1665 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -31,7 +31,7 @@ import org.jetbrains.jet.codegen.generated.AbstractBlackBoxCodegenTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @TestMetadata("compiler/testData/codegen/boxWithStdlib") -@InnerTestClasses({BlackBoxWithStdlibCodegenTestGenerated.Annotations.class, BlackBoxWithStdlibCodegenTestGenerated.Casts.class, BlackBoxWithStdlibCodegenTestGenerated.DataClasses.class, BlackBoxWithStdlibCodegenTestGenerated.FullJdk.class, BlackBoxWithStdlibCodegenTestGenerated.JdkAnnotations.class, BlackBoxWithStdlibCodegenTestGenerated.Ranges.class, BlackBoxWithStdlibCodegenTestGenerated.Regressions.class, BlackBoxWithStdlibCodegenTestGenerated.Strings.class}) +@InnerTestClasses({BlackBoxWithStdlibCodegenTestGenerated.Annotations.class, BlackBoxWithStdlibCodegenTestGenerated.Arrays.class, BlackBoxWithStdlibCodegenTestGenerated.Casts.class, BlackBoxWithStdlibCodegenTestGenerated.DataClasses.class, BlackBoxWithStdlibCodegenTestGenerated.FullJdk.class, BlackBoxWithStdlibCodegenTestGenerated.JdkAnnotations.class, BlackBoxWithStdlibCodegenTestGenerated.Ranges.class, BlackBoxWithStdlibCodegenTestGenerated.Regressions.class, BlackBoxWithStdlibCodegenTestGenerated.Strings.class}) public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCodegenTest { public void testAllFilesPresentInBoxWithStdlib() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/boxWithStdlib"), Pattern.compile("^(.+)\\.kt$"), true); @@ -50,6 +50,19 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode } + @TestMetadata("compiler/testData/codegen/boxWithStdlib/arrays") + public static class Arrays extends AbstractBlackBoxCodegenTest { + public void testAllFilesPresentInArrays() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/boxWithStdlib/arrays"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("kt3771.kt") + public void testKt3771() throws Exception { + doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/arrays/kt3771.kt"); + } + + } + @TestMetadata("compiler/testData/codegen/boxWithStdlib/casts") public static class Casts extends AbstractBlackBoxCodegenTest { public void testAllFilesPresentInCasts() throws Exception { @@ -896,6 +909,7 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode TestSuite suite = new TestSuite("BlackBoxWithStdlibCodegenTestGenerated"); suite.addTestSuite(BlackBoxWithStdlibCodegenTestGenerated.class); suite.addTestSuite(Annotations.class); + suite.addTestSuite(Arrays.class); suite.addTestSuite(Casts.class); suite.addTest(DataClasses.innerSuite()); suite.addTestSuite(FullJdk.class);