KT-3771 Fixed
This commit is contained in:
@@ -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
|
||||
|
||||
+15
-1
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user