From 1198b40c11e453cb4caeca275ee480e7fb396bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Tue, 11 May 2021 14:36:54 +0200 Subject: [PATCH] Parcelize: Port the fix for KT-41553 to android-extensions Fixes KT-46590. --- .../parcel/ir/IrParcelSerializerFactory.kt | 5 +++- .../parcel/ParcelBoxTestGenerated.java | 10 +++++++ .../parcel/ParcelIrBoxTestGenerated.java | 10 +++++++ .../testData/parcel/box/kt41553.kt | 29 +++++++++++++++++++ .../testData/parcel/box/kt41553_2.kt | 29 +++++++++++++++++++ .../customParcelablesSameModule.ir.txt | 1 + .../parcel/codegen/customSimple.ir.txt | 5 ++-- .../codegen/customSimpleWithNewArray.ir.txt | 7 +++-- 8 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt41553.kt create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt41553_2.kt diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/IrParcelSerializerFactory.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/IrParcelSerializerFactory.kt index e9b4135729d..442de8118d9 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/IrParcelSerializerFactory.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/IrParcelSerializerFactory.kt @@ -119,7 +119,10 @@ class IrParcelSerializerFactory(symbols: AndroidSymbols) { val arrayType = if (classifier.defaultType.isPrimitiveArray()) classifier.defaultType else irBuiltIns.arrayClass.typeWith(elementType) - return IrArrayParcelSerializer(arrayType, elementType, get(elementType, scope, parcelizeType, strict())) + return wrapNullableSerializerIfNeeded( + irType, + IrArrayParcelSerializer(arrayType, elementType, get(elementType, scope, parcelizeType, strict())) + ) } // This will only be hit if we have a custom serializer for booleans diff --git a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelBoxTestGenerated.java b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelBoxTestGenerated.java index 7d9e9206ccf..07cac6661ef 100644 --- a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelBoxTestGenerated.java +++ b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelBoxTestGenerated.java @@ -180,6 +180,16 @@ public class ParcelBoxTestGenerated extends AbstractParcelBoxTest { runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt39981.kt"); } + @TestMetadata("kt41553.kt") + public void testKt41553() throws Exception { + runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt41553.kt"); + } + + @TestMetadata("kt41553_2.kt") + public void testKt41553_2() throws Exception { + runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt41553_2.kt"); + } + @TestMetadata("listKinds.kt") public void testListKinds() throws Exception { runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/box/listKinds.kt"); diff --git a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelIrBoxTestGenerated.java b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelIrBoxTestGenerated.java index a4408f34d0a..29361d089b5 100644 --- a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelIrBoxTestGenerated.java +++ b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelIrBoxTestGenerated.java @@ -180,6 +180,16 @@ public class ParcelIrBoxTestGenerated extends AbstractParcelIrBoxTest { runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt39981.kt"); } + @TestMetadata("kt41553.kt") + public void testKt41553() throws Exception { + runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt41553.kt"); + } + + @TestMetadata("kt41553_2.kt") + public void testKt41553_2() throws Exception { + runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt41553_2.kt"); + } + @TestMetadata("listKinds.kt") public void testListKinds() throws Exception { runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/box/listKinds.kt"); diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt41553.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt41553.kt new file mode 100644 index 00000000000..b4558a6623b --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt41553.kt @@ -0,0 +1,29 @@ +// WITH_RUNTIME + +@file:JvmName("TestKt") +package test + +import kotlinx.android.parcel.* +import android.os.Parcel +import android.os.Parcelable +import java.util.Arrays + +@Parcelize +data class A(val params: @RawValue Array<*>? = null): Parcelable + +fun box() = parcelTest { parcel -> + val a1 = A(arrayOf(1,2,3)) + val b1 = A() + a1.writeToParcel(parcel, 0) + b1.writeToParcel(parcel, 0) + + val bytes = parcel.marshall() + parcel.unmarshall(bytes, 0, bytes.size) + parcel.setDataPosition(0) + + val a2 = readFromParcel(parcel) + assert(a2.params != null) + assert(Arrays.equals(a1.params!!, a2.params!!)) + val b2 = readFromParcel(parcel) + assert(b1 == b2) +} diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt41553_2.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt41553_2.kt new file mode 100644 index 00000000000..d147ec1aa84 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt41553_2.kt @@ -0,0 +1,29 @@ +// WITH_RUNTIME + +@file:JvmName("TestKt") +package test + +import kotlinx.android.parcel.* +import android.os.Parcel +import android.os.Parcelable +import java.util.Arrays + +@Parcelize +data class A(val params: Array? = null): Parcelable + +fun box() = parcelTest { parcel -> + val a1 = A(arrayOf(1,2,3)) + val b1 = A() + a1.writeToParcel(parcel, 0) + b1.writeToParcel(parcel, 0) + + val bytes = parcel.marshall() + parcel.unmarshall(bytes, 0, bytes.size) + parcel.setDataPosition(0) + + val a2 = readFromParcel(parcel) + assert(a2.params != null) + assert(Arrays.equals(a1.params!!, a2.params!!)) + val b2 = readFromParcel(parcel) + assert(b1 == b2) +} diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesSameModule.ir.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesSameModule.ir.txt index 414b0ada937..f2cdcbe60f9 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesSameModule.ir.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesSameModule.ir.txt @@ -29,6 +29,7 @@ public final class k/KotlinParcelable$Creator : java/lang/Object, android/os/Par public java.lang.Object createFromParcel(android.os.Parcel p0) { LABEL (L0) + LINENUMBER (21) ALOAD (0) ALOAD (1) INVOKEVIRTUAL (k/KotlinParcelable$Creator, createFromParcel, (Landroid/os/Parcel;)Lk/KotlinParcelable;) diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.ir.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.ir.txt index fc750d9a390..188e42d3f81 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.ir.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.ir.txt @@ -20,6 +20,7 @@ final class User$Companion : java/lang/Object, kotlinx/android/parcel/Parceler { public java.lang.Object[] newArray(int size) { LABEL (L0) + LINENUMBER (10) ALOAD (0) ILOAD (1) INVOKEVIRTUAL (User$Companion, newArray, (I)[LUser;) @@ -40,7 +41,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato ALOAD (1) LDC (parcel) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) - INVOKESTATIC (User, access$getCompanion$p$s2645995, ()LUser$Companion;) + INVOKESTATIC (User, access$getCompanion$p, ()LUser$Companion;) ALOAD (1) INVOKEVIRTUAL (User$Companion, create, (Landroid/os/Parcel;)LUser;) ARETURN @@ -89,7 +90,7 @@ public final class User : java/lang/Object, android/os/Parcelable { public void (java.lang.String firstName, java.lang.String lastName, int age) - public final static User$Companion access$getCompanion$p$s2645995() + public final static User$Companion access$getCompanion$p() public int describeContents() diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.ir.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.ir.txt index 47a8672806f..a3eb0cf0ebf 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.ir.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.ir.txt @@ -18,6 +18,7 @@ final class User$Companion : java/lang/Object, kotlinx/android/parcel/Parceler { public java.lang.Object[] newArray(int size) { LABEL (L0) + LINENUMBER (10) ALOAD (0) ILOAD (1) INVOKEVIRTUAL (User$Companion, newArray, (I)[LUser;) @@ -39,7 +40,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato public final User[] newArray(int size) { LABEL (L0) - INVOKESTATIC (User, access$getCompanion$p$s2645995, ()LUser$Companion;) + INVOKESTATIC (User, access$getCompanion$p, ()LUser$Companion;) ILOAD (1) INVOKEVIRTUAL (User$Companion, newArray, (I)[LUser;) ARETURN @@ -71,7 +72,7 @@ public final class User : java/lang/Object, android/os/Parcelable { public void (java.lang.String firstName, java.lang.String lastName, int age) - public final static User$Companion access$getCompanion$p$s2645995() + public final static User$Companion access$getCompanion$p() public int describeContents() @@ -82,4 +83,4 @@ public final class User : java/lang/Object, android/os/Parcelable { public final java.lang.String getLastName() public void writeToParcel(android.os.Parcel out, int flags) -} +} \ No newline at end of file