From f93749ae6a5ea1f54e0e0caf81608f92cbff3dc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Tue, 12 May 2020 16:04:57 +0200 Subject: [PATCH] Parcelize: Fall back to readValue/writeValue if no other serializers are available --- .../parcel/ir/ParcelableIrTransformer.kt | 2 +- .../ParcelBytecodeListingTestGenerated.java | 5 ++ .../ParcelIrBytecodeListingTestGenerated.java | 5 ++ .../parcel/codegen/serializeValue.ir.txt | 80 +++++++++++++++++++ .../testData/parcel/codegen/serializeValue.kt | 13 +++ .../parcel/codegen/serializeValue.txt | 68 ++++++++++++++++ 6 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializeValue.ir.txt create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializeValue.kt create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializeValue.txt diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/ParcelableIrTransformer.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/ParcelableIrTransformer.kt index 83b753c575c..ceb4c7cf97f 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/ParcelableIrTransformer.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ir/ParcelableIrTransformer.kt @@ -305,7 +305,7 @@ class ParcelableIrTransformer(private val context: IrPluginContext, private val val property = properties.first { it.name == parameter.name } val localScope = property.getParcelerScope(toplevelScope) ParcelableProperty(property.backingField!!) { - serializerFactory.get(parameter.type, parcelizeType = defaultType, strict = true, scope = localScope) + serializerFactory.get(parameter.type, parcelizeType = defaultType, scope = localScope) } } } diff --git a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelBytecodeListingTestGenerated.java b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelBytecodeListingTestGenerated.java index 0a9129f1a5a..98216faf66f 100644 --- a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelBytecodeListingTestGenerated.java +++ b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelBytecodeListingTestGenerated.java @@ -99,6 +99,11 @@ public class ParcelBytecodeListingTestGenerated extends AbstractParcelBytecodeLi runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializable.kt"); } + @TestMetadata("serializeValue.kt") + public void testSerializeValue() throws Exception { + runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializeValue.kt"); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.kt"); diff --git a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelIrBytecodeListingTestGenerated.java b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelIrBytecodeListingTestGenerated.java index 44586375f0d..fba8199a761 100644 --- a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelIrBytecodeListingTestGenerated.java +++ b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/parcel/ParcelIrBytecodeListingTestGenerated.java @@ -99,6 +99,11 @@ public class ParcelIrBytecodeListingTestGenerated extends AbstractParcelIrByteco runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializable.kt"); } + @TestMetadata("serializeValue.kt") + public void testSerializeValue() throws Exception { + runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializeValue.kt"); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.kt"); diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializeValue.ir.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializeValue.ir.txt new file mode 100644 index 00000000000..0fc65dc1950 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializeValue.ir.txt @@ -0,0 +1,80 @@ +public final class Test$Creator : java/lang/Object, android/os/Parcelable$Creator { + public void () + + public final Test createFromParcel(android.os.Parcel parcel) { + LABEL (L0) + ALOAD (1) + LDC (parcel) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + NEW + DUP + ALOAD (1) + LDC (LTest;) + INVOKEVIRTUAL (java/lang/Class, getClassLoader, ()Ljava/lang/ClassLoader;) + INVOKEVIRTUAL (android/os/Parcel, readValue, (Ljava/lang/ClassLoader;)Ljava/lang/Object;) + CHECKCAST + INVOKESPECIAL (Test, , (LValue;)V) + ARETURN + LABEL (L1) + } + + public java.lang.Object createFromParcel(android.os.Parcel source) { + LABEL (L0) + ALOAD (0) + ALOAD (1) + INVOKEVIRTUAL (Test$Creator, createFromParcel, (Landroid/os/Parcel;)LTest;) + ARETURN + LABEL (L1) + } + + public final Test[] newArray(int size) + + public java.lang.Object[] newArray(int size) +} + +public final class Test : java/lang/Object, android/os/Parcelable { + public final static android.os.Parcelable$Creator CREATOR + + private final Value value + + static void () { + NEW + DUP + INVOKESPECIAL (Test$Creator, , ()V) + CHECKCAST + PUTSTATIC (CREATOR, Landroid/os/Parcelable$Creator;) + RETURN + } + + public void (Value value) + + public int describeContents() { + LABEL (L0) + ICONST_0 + IRETURN + LABEL (L1) + } + + public final Value getValue() + + public void writeToParcel(android.os.Parcel out, int flags) { + LABEL (L0) + ALOAD (1) + LDC (out) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (1) + ALOAD (0) + GETFIELD (value, LValue;) + INVOKEVIRTUAL (android/os/Parcel, writeValue, (Ljava/lang/Object;)V) + RETURN + LABEL (L1) + } +} + +public final class Value : java/lang/Object { + private final int x + + public void (int x) + + public final int getX() +} diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializeValue.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializeValue.kt new file mode 100644 index 00000000000..283f22c223d --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializeValue.kt @@ -0,0 +1,13 @@ +// This test checks that we create calls to readValue/writeValue if there is no other +// way of serializing properties. In this case, this would fail at runtime. + +// CURIOUS_ABOUT writeToParcel, createFromParcel, , describeContents +// WITH_RUNTIME + +import kotlinx.android.parcel.* +import android.os.Parcelable + +class Value(val x: Int) + +@Parcelize +class Test(val value: Value) : Parcelable diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializeValue.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializeValue.txt new file mode 100644 index 00000000000..a20601f170a --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializeValue.txt @@ -0,0 +1,68 @@ +public final class Test$Creator : java/lang/Object, android/os/Parcelable$Creator { + public void () + + public final java.lang.Object createFromParcel(android.os.Parcel in) { + LABEL (L0) + ALOAD (1) + LDC (in) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + NEW + DUP + ALOAD (1) + LDC (LValue;) + INVOKEVIRTUAL (java/lang/Class, getClassLoader, ()Ljava/lang/ClassLoader;) + INVOKEVIRTUAL (android/os/Parcel, readValue, (Ljava/lang/ClassLoader;)Ljava/lang/Object;) + CHECKCAST + INVOKESPECIAL (Test, , (LValue;)V) + ARETURN + LABEL (L1) + } + + public final java.lang.Object[] newArray(int size) +} + +public final class Test : java/lang/Object, android/os/Parcelable { + public final static android.os.Parcelable$Creator CREATOR + + private final Value value + + static void () { + NEW + DUP + INVOKESPECIAL (Test$Creator, , ()V) + PUTSTATIC (CREATOR, Landroid/os/Parcelable$Creator;) + RETURN + } + + public void (Value value) + + public int describeContents() { + LABEL (L0) + LDC (0) + IRETURN + LABEL (L1) + } + + public final Value getValue() + + public void writeToParcel(android.os.Parcel parcel, int flags) { + LABEL (L0) + ALOAD (1) + LDC (parcel) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (1) + ALOAD (0) + GETFIELD (value, LValue;) + INVOKEVIRTUAL (android/os/Parcel, writeValue, (Ljava/lang/Object;)V) + RETURN + LABEL (L1) + } +} + +public final class Value : java/lang/Object { + private final int x + + public void (int x) + + public final int getX() +}