From 9d000529e70527b3f320ccb4baf8490e6efbb2c1 Mon Sep 17 00:00:00 2001 From: rbares Date: Mon, 6 Jul 2020 02:33:36 +0100 Subject: [PATCH] Fix JVM Parcelize use of Parceler --- .../parcel/ParcelableCodegenExtension.kt | 8 ++-- .../testData/parcel/box/customNewArray.kt | 40 +++++++++++++++++++ .../testData/parcel/box/kt39981.kt | 21 ++++++++++ .../testData/parcel/box/newArray.kt | 29 ++++++++++++++ .../testData/parcel/codegen/customSimple.txt | 2 +- .../codegen/customSimpleWithNewArray.txt | 2 +- 6 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/parcel/box/customNewArray.kt create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt39981.kt create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/parcel/box/newArray.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 87eb5c20edf..1a269af41ab 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 @@ -226,7 +226,7 @@ open class ParcelableCodegenExtension : ParcelableExtensionBase, ExpressionCodeg v.getstatic(containerAsmType.internalName, companionFieldName, companionAsmType.descriptor) v.load(1, PARCEL_TYPE) - v.invokevirtual(companionAsmType.internalName, "create", "(${PARCEL_TYPE.descriptor})Ljava/lang/Object;", false) + v.invokevirtual(companionAsmType.internalName, "create", "(${PARCEL_TYPE.descriptor})$containerAsmType", false) } else { v.anew(containerAsmType) @@ -367,8 +367,8 @@ open class ParcelableCodegenExtension : ParcelableExtensionBase, ExpressionCodeg v.getstatic(containerAsmType.internalName, companionFieldName, companionAsmType.descriptor) v.load(1, Type.INT_TYPE) - v.invokevirtual(companionAsmType.internalName, "newArray", "(I)[Ljava/lang/Object;", false) - v.areturn(Type.getType("[Ljava/lang/Object;")) + v.invokevirtual(companionAsmType.internalName, "newArray", "(I)[$parcelableAsmType", false) + v.areturn(Type.getType("[$parcelableAsmType")) return@write } @@ -376,7 +376,7 @@ open class ParcelableCodegenExtension : ParcelableExtensionBase, ExpressionCodeg v.load(1, Type.INT_TYPE) v.newarray(parcelableAsmType) - v.areturn(Type.getType("[L$parcelableAsmType;")) + v.areturn(Type.getType("[$parcelableAsmType")) } } diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/customNewArray.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/customNewArray.kt new file mode 100644 index 00000000000..833f05a7608 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/customNewArray.kt @@ -0,0 +1,40 @@ +// WITH_RUNTIME + +@file:JvmName("TestKt") +package test + +import kotlinx.android.parcel.* +import android.os.Parcel +import android.os.Parcelable + +@Parcelize +data class User(val firstName: String, val secondName: String, val age: Int) : Parcelable { + companion object : Parceler { + override fun User.write(parcel: Parcel, flags: Int) { + parcel.writeString(firstName) + parcel.writeString(secondName) + } + + override fun create(parcel: Parcel) = User(parcel.readString(), parcel.readString(), 0) + + override fun newArray(size: Int) = arrayOfNulls(size) as Array + } +} + +fun box() = parcelTest { parcel -> + val user = User("John", "Smith", 20) + val user2 = User("Joe", "Bloggs", 30) + val array = arrayOf(user, user2) + parcel.writeTypedArray(array, 0) + + val bytes = parcel.marshall() + parcel.unmarshall(bytes, 0, bytes.size) + parcel.setDataPosition(0) + + val creator = User::class.java.getDeclaredField("CREATOR").get(null) as Parcelable.Creator + val result = parcel.createTypedArray(creator) + + assert(result.size == 2) + assert(result[0].firstName == user.firstName) + assert(result[1].firstName == user2.firstName) +} diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt39981.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt39981.kt new file mode 100644 index 00000000000..e341dad4a67 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt39981.kt @@ -0,0 +1,21 @@ +// WITH_RUNTIME + +@file:JvmName("TestKt") +package test + +import kotlinx.android.parcel.* +import android.os.Parcel +import android.os.Parcelable + +@Parcelize class TestParcel : Parcelable { + companion object : Parceler { + override fun create(parcel: Parcel): TestParcel { + return TestParcel() + } + override fun TestParcel.write(parcel: Parcel, flags: Int) {} + } +} + +fun box() = parcelTest { parcel -> + TestParcel() +} diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/newArray.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/newArray.kt new file mode 100644 index 00000000000..7c936aa2808 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/newArray.kt @@ -0,0 +1,29 @@ +// WITH_RUNTIME + +@file:JvmName("TestKt") +package test + +import kotlinx.android.parcel.* +import android.os.Parcel +import android.os.Parcelable + +@Parcelize +data class User(val firstName: String, val secondName: String, val age: Int) : Parcelable + +fun box() = parcelTest { parcel -> + val user = User("John", "Smith", 20) + val user2 = User("Joe", "Bloggs", 30) + val array = arrayOf(user, user2) + parcel.writeTypedArray(array, 0) + + val bytes = parcel.marshall() + parcel.unmarshall(bytes, 0, bytes.size) + parcel.setDataPosition(0) + + val creator = User::class.java.getDeclaredField("CREATOR").get(null) as Parcelable.Creator + val result = parcel.createTypedArray(creator) + + assert(result.size == 2) + assert(result[0].firstName == user.firstName) + assert(result[1].firstName == user2.firstName) +} 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 fe50e70e252..2469d37c714 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 @@ -42,7 +42,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) GETSTATIC (Companion, LUser$Companion;) ALOAD (1) - INVOKEVIRTUAL (User$Companion, create, (Landroid/os/Parcel;)Ljava/lang/Object;) + INVOKEVIRTUAL (User$Companion, create, (Landroid/os/Parcel;)LUser;) ARETURN LABEL (L1) } 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 75c44dd081c..5782a5a990b 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 @@ -41,7 +41,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato LABEL (L0) GETSTATIC (Companion, LUser$Companion;) ILOAD (1) - INVOKEVIRTUAL (User$Companion, newArray, (I)[Ljava/lang/Object;) + INVOKEVIRTUAL (User$Companion, newArray, (I)[LUser;) ARETURN LABEL (L1) }