From e28cffd0ad98fd411724198c0705d70e5f67898a Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 18 Oct 2017 23:49:30 +0300 Subject: [PATCH] Parcelable: newArray() result type should be Object[] (KT-20717) --- .../parcel/ParcelableCodegenExtension.kt | 6 ++-- .../android/parcel/AbstractParcelBoxTest.kt | 2 +- .../jetbrains/android/parcel/ParcelBoxTest.kt | 1 + .../testData/parcel/box/kt20717.kt | 30 +++++++++++++++++++ .../parcel/codegen/IBinderIInterface.txt | 2 +- .../parcel/codegen/customDescribeContents.txt | 2 +- .../customParcelablesDifferentModule.txt | 2 +- .../codegen/customParcelablesSameModule.txt | 2 +- .../testData/parcel/codegen/customSimple.txt | 2 +- .../codegen/customSimpleWithNewArray.txt | 4 +-- .../codegen/describeContentsFromSuperType.txt | 2 +- .../parcel/codegen/duplicatingClinit.txt | 2 +- .../parcel/codegen/listInsideList.txt | 2 +- .../parcel/codegen/nullableNotNullSize.txt | 4 +-- .../testData/parcel/codegen/parcelable.txt | 2 +- .../testData/parcel/codegen/serializable.txt | 2 +- .../testData/parcel/codegen/simple.txt | 2 +- .../testData/parcel/codegen/simpleList.txt | 2 +- .../testData/parcel/codegen/size.txt | 4 +-- 19 files changed, 53 insertions(+), 22 deletions(-) create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt20717.kt diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt index 4913dde24ad..e976e601c9c 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt @@ -296,7 +296,7 @@ open class ParcelableCodegenExtension : ExpressionCodegenExtension { val parcelableAsmType = codegen.typeMapper.mapType(parcelableClass) createMethod(creatorClass, NEW_ARRAY, - builtIns.getArrayType(Variance.INVARIANT, parcelableClass.defaultType), + builtIns.getArrayType(Variance.INVARIANT, builtIns.anyType), "size" to builtIns.intType ).write(codegen) { if (parcelerObject != null) { @@ -315,8 +315,8 @@ open class ParcelableCodegenExtension : ExpressionCodegenExtension { v.getstatic(containerAsmType.internalName, companionFieldName, companionAsmType.descriptor) v.load(1, Type.INT_TYPE) - v.invokevirtual(companionAsmType.internalName, "newArray", "(I)[${containerAsmType.descriptor}", false) - v.areturn(Type.getType("[L$parcelableAsmType;")) + v.invokevirtual(companionAsmType.internalName, "newArray", "(I)[Ljava/lang/Object;", false) + v.areturn(Type.getType("[Ljava/lang/Object;")) return@write } diff --git a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/android/parcel/AbstractParcelBoxTest.kt b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/android/parcel/AbstractParcelBoxTest.kt index 0b5b15e3cc3..d693d3c02de 100644 --- a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/android/parcel/AbstractParcelBoxTest.kt +++ b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/android/parcel/AbstractParcelBoxTest.kt @@ -155,7 +155,7 @@ abstract class AbstractParcelBoxTest : CodegenTestCase() { process.waitFor(3, TimeUnit.MINUTES) if (process.exitValue() != 0) { - throw AssertionError(classFileFactory.createText()) + throw AssertionError("Process exited with exit code ${process.exitValue()} \n" + classFileFactory.createText()) } } finally { if (!dirForTestClasses.deleteRecursively()) { diff --git a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/android/parcel/ParcelBoxTest.kt b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/android/parcel/ParcelBoxTest.kt index 15b52e7a468..bbcc0a310ec 100644 --- a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/android/parcel/ParcelBoxTest.kt +++ b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/android/parcel/ParcelBoxTest.kt @@ -53,6 +53,7 @@ class ParcelBoxTest : AbstractParcelBoxTest() { fun testCustomSerializerSimple() = doTest("customSerializerSimple") fun testCustomSerializerWriteWith() = doTest("customSerializerWriteWith") fun testCustomSerializerBoxing() = doTest("customSerializerBoxing") + fun testKt20717() = doTest("kt20717") } class ParcelBoxTestWithSerializableLikeExtension : AbstractParcelBoxTest() { diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt20717.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt20717.kt new file mode 100644 index 00000000000..a9c2d1fc0a9 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt20717.kt @@ -0,0 +1,30 @@ +// WITH_RUNTIME + +@file:JvmName("TestKt") +package test + +import kotlinx.android.parcel.* +import android.os.Parcel +import android.os.Parcelable + +fun box() = doTest { creator -> + assert(creator.newArray(5) != null) +} + +fun doTest(work: (Parcelable.Creator) -> Unit): String { + val dummy = DummyParcelable(42) + + val clazz = dummy.javaClass + val field = clazz.getDeclaredField("CREATOR") + val creator = field.get(dummy) as Parcelable.Creator + + val parcel = Parcel.obtain() + dummy.writeToParcel(parcel, 0) + parcel.setDataPosition(0) + + work(creator) + return "OK" +} + +@Parcelize +data class DummyParcelable(val int: Int): Parcelable \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/IBinderIInterface.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/IBinderIInterface.txt index 22a2be9f6bb..185455e6074 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/IBinderIInterface.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/IBinderIInterface.txt @@ -47,7 +47,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato LABEL (L4) } - public final User[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class User : java/lang/Object, android/os/Parcelable { diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.txt index fdb0d3ae4dd..e9cba7fb9ac 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.txt @@ -3,7 +3,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato public final java.lang.Object createFromParcel(android.os.Parcel p0) - public final User[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class User : java/lang/Object, android/os/Parcelable { diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesDifferentModule.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesDifferentModule.txt index 40e5e4143bd..236e35ee066 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesDifferentModule.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesDifferentModule.txt @@ -18,7 +18,7 @@ public final class test/Foo$Creator : java/lang/Object, android/os/Parcelable$Cr LABEL (L1) } - public final test.Foo[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class test/Foo : java/lang/Object, android/os/Parcelable { diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesSameModule.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesSameModule.txt index a009ad2781a..065028d8ec5 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesSameModule.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesSameModule.txt @@ -121,7 +121,7 @@ public final class test/Foo$Creator : java/lang/Object, android/os/Parcelable$Cr LABEL (L1) } - public final test.Foo[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class test/Foo : java/lang/Object, android/os/Parcelable { diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.txt index 3a84363f912..126536780b7 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.txt @@ -48,7 +48,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato LABEL (L1) } - public final User[] newArray(int p0) { + public final java.lang.Object[] newArray(int p0) { LABEL (L0) ILOAD (1) ANEWARRAY diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.txt index e124e583f68..50192d4f828 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.txt @@ -36,11 +36,11 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato public final java.lang.Object createFromParcel(android.os.Parcel p0) - public final User[] newArray(int p0) { + public final java.lang.Object[] newArray(int p0) { LABEL (L0) GETSTATIC (Companion, LUser$Companion;) ILOAD (1) - INVOKEVIRTUAL (User$Companion, newArray, (I)[LUser;) + INVOKEVIRTUAL (User$Companion, newArray, (I)[Ljava/lang/Object;) ARETURN LABEL (L1) } diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.txt index f197e391fdf..9573414eabb 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.txt @@ -15,7 +15,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato public final java.lang.Object createFromParcel(android.os.Parcel p0) - public final User[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class User : AbstractUser { diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/duplicatingClinit.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/duplicatingClinit.txt index c3b6f267a22..fa037ea2387 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/duplicatingClinit.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/duplicatingClinit.txt @@ -15,7 +15,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato public final java.lang.Object createFromParcel(android.os.Parcel p0) - public final User[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class User : java/lang/Object, android/os/Parcelable { diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.txt index 30cd0909dde..dbd265cbe58 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.txt @@ -3,7 +3,7 @@ public final class Test$Creator : java/lang/Object, android/os/Parcelable$Creato public final java.lang.Object createFromParcel(android.os.Parcel p0) - public final Test[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class Test : java/lang/Object { diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/nullableNotNullSize.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/nullableNotNullSize.txt index 557e0874573..2ca4f0f4d43 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/nullableNotNullSize.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/nullableNotNullSize.txt @@ -3,7 +3,7 @@ public final class TestNotNull$Creator : java/lang/Object, android/os/Parcelable public final java.lang.Object createFromParcel(android.os.Parcel p0) - public final TestNotNull[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class TestNotNull : java/lang/Object { @@ -38,7 +38,7 @@ public final class TestNullable$Creator : java/lang/Object, android/os/Parcelabl public final java.lang.Object createFromParcel(android.os.Parcel p0) - public final TestNullable[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class TestNullable : java/lang/Object { diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.txt index d8a0c924d03..25e8aaa4213 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.txt @@ -17,7 +17,7 @@ public final class test/Foo$Creator : java/lang/Object, android/os/Parcelable$Cr LABEL (L1) } - public final test.Foo[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class test/Foo : java/lang/Object, android/os/Parcelable { diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializable.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializable.txt index 3277a721e4e..6edf24e7ff4 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializable.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializable.txt @@ -31,7 +31,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato LABEL (L1) } - public final User[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class User : java/lang/Object, android/os/Parcelable { diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.txt index b4aa3d433b3..35406082d5d 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.txt @@ -25,7 +25,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato in: Landroid/os/Parcel; } - public final User[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class User : java/lang/Object, android/os/Parcelable { diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.txt index 80998b127dc..797fc84e2f4 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.txt @@ -3,7 +3,7 @@ public final class Test$Creator : java/lang/Object, android/os/Parcelable$Creato public final java.lang.Object createFromParcel(android.os.Parcel p0) - public final Test[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class Test : java/lang/Object { diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/size.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/size.txt index 5fa32d85a3c..9aa7c64f331 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/size.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/size.txt @@ -25,7 +25,7 @@ public final class Test$Creator : java/lang/Object, android/os/Parcelable$Creato LABEL (L4) } - public final Test[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class Test : java/lang/Object, android/os/Parcelable { @@ -115,7 +115,7 @@ public final class TestF$Creator : java/lang/Object, android/os/Parcelable$Creat LABEL (L4) } - public final TestF[] newArray(int p0) + public final java.lang.Object[] newArray(int p0) } public final class TestF : java/lang/Object, android/os/Parcelable {