KT-3771 Fixed
This commit is contained in:
@@ -219,7 +219,7 @@ public class JetTypeMapper extends BindingTraceAware {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Type mapType(@NotNull JetType jetType, @Nullable BothSignatureWriter signatureVisitor, @NotNull JetTypeMapperMode kind) {
|
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
|
@NotNull
|
||||||
@@ -227,7 +227,17 @@ public class JetTypeMapper extends BindingTraceAware {
|
|||||||
@NotNull JetType jetType,
|
@NotNull JetType jetType,
|
||||||
@Nullable BothSignatureWriter signatureVisitor,
|
@Nullable BothSignatureWriter signatureVisitor,
|
||||||
@NotNull JetTypeMapperMode kind,
|
@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;
|
Type known = null;
|
||||||
DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor();
|
DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor();
|
||||||
@@ -243,7 +253,7 @@ public class JetTypeMapper extends BindingTraceAware {
|
|||||||
return mapKnownAsmType(jetType, known, signatureVisitor, howThisTypeIsUsed);
|
return mapKnownAsmType(jetType, known, signatureVisitor, howThisTypeIsUsed);
|
||||||
}
|
}
|
||||||
else if (kind == JetTypeMapperMode.TYPE_PARAMETER) {
|
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) {
|
else if (kind == JetTypeMapperMode.TRAIT_IMPL) {
|
||||||
throw new IllegalStateException("TRAIT_IMPL is not possible for " + jetType);
|
throw new IllegalStateException("TRAIT_IMPL is not possible for " + jetType);
|
||||||
@@ -291,7 +301,7 @@ public class JetTypeMapper extends BindingTraceAware {
|
|||||||
|
|
||||||
if (signatureVisitor != null) {
|
if (signatureVisitor != null) {
|
||||||
signatureVisitor.writeArrayType(jetType.isNullable(), memberProjection.getProjectionKind());
|
signatureVisitor.writeArrayType(jetType.isNullable(), memberProjection.getProjectionKind());
|
||||||
mapType(memberType, signatureVisitor, JetTypeMapperMode.TYPE_PARAMETER);
|
mapType(memberType, signatureVisitor, JetTypeMapperMode.TYPE_PARAMETER, memberProjection.getProjectionKind(), true);
|
||||||
signatureVisitor.writeArrayEnd();
|
signatureVisitor.writeArrayEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -408,10 +418,24 @@ public class JetTypeMapper extends BindingTraceAware {
|
|||||||
Type asmType,
|
Type asmType,
|
||||||
@Nullable BothSignatureWriter signatureVisitor,
|
@Nullable BothSignatureWriter signatureVisitor,
|
||||||
@NotNull Variance howThisTypeIsUsed
|
@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 (signatureVisitor != null) {
|
||||||
if (jetType.getArguments().isEmpty()) {
|
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);
|
signatureVisitor.writeAsmType(asmType, jetType.isNullable(), kotlinTypeName);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -424,12 +448,18 @@ public class JetTypeMapper extends BindingTraceAware {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static String getKotlinTypeNameForSignature(@NotNull JetType jetType, @NotNull Type asmType) {
|
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();
|
ClassifierDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor();
|
||||||
if (descriptor == null) return null;
|
if (descriptor == null) return null;
|
||||||
if (asmType.getSort() != Type.OBJECT) return null;
|
if (asmType.getSort() != Type.OBJECT) return null;
|
||||||
|
|
||||||
JvmClassName jvmClassName = JvmClassName.byType(asmType);
|
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 JvmClassName.byClassDescriptor(descriptor).getSignatureName();
|
||||||
}
|
}
|
||||||
return null;
|
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
|
// method: _DefaultPackage::never
|
||||||
// jvm signature: ()[Ljava/lang/Integer;
|
// jvm signature: ()[Ljava/lang/Integer;
|
||||||
// generic signature: null
|
// 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 */
|
/** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */
|
||||||
@SuppressWarnings("all")
|
@SuppressWarnings("all")
|
||||||
@TestMetadata("compiler/testData/codegen/boxWithStdlib")
|
@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 class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||||
public void testAllFilesPresentInBoxWithStdlib() throws Exception {
|
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);
|
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")
|
@TestMetadata("compiler/testData/codegen/boxWithStdlib/casts")
|
||||||
public static class Casts extends AbstractBlackBoxCodegenTest {
|
public static class Casts extends AbstractBlackBoxCodegenTest {
|
||||||
public void testAllFilesPresentInCasts() throws Exception {
|
public void testAllFilesPresentInCasts() throws Exception {
|
||||||
@@ -896,6 +909,7 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
|||||||
TestSuite suite = new TestSuite("BlackBoxWithStdlibCodegenTestGenerated");
|
TestSuite suite = new TestSuite("BlackBoxWithStdlibCodegenTestGenerated");
|
||||||
suite.addTestSuite(BlackBoxWithStdlibCodegenTestGenerated.class);
|
suite.addTestSuite(BlackBoxWithStdlibCodegenTestGenerated.class);
|
||||||
suite.addTestSuite(Annotations.class);
|
suite.addTestSuite(Annotations.class);
|
||||||
|
suite.addTestSuite(Arrays.class);
|
||||||
suite.addTestSuite(Casts.class);
|
suite.addTestSuite(Casts.class);
|
||||||
suite.addTest(DataClasses.innerSuite());
|
suite.addTest(DataClasses.innerSuite());
|
||||||
suite.addTestSuite(FullJdk.class);
|
suite.addTestSuite(FullJdk.class);
|
||||||
|
|||||||
Reference in New Issue
Block a user