KT-3771 Fixed

This commit is contained in:
Yakov Zaytsev
2013-07-19 14:26:16 +04:00
parent 9cc51d6db1
commit bb364cd393
4 changed files with 66 additions and 8 deletions
@@ -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;
@@ -0,0 +1,14 @@
fun fill(dest : Array<in String>, v : String) {
dest[0] = v
}
fun box() : String {
//fun main(args : Array<String>) {
val s : String = "bar"
val any : Array<Any> = array(1, "foo", 1.234)
fill(any, s)
/* shouldn't throw
ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
*/
return "OK"
}
@@ -3,4 +3,4 @@ fun never(): Array<Int> = 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
@@ -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);