diff --git a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializers.kt b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializers.kt index 4a38006ff5e..460580cb117 100644 --- a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializers.kt +++ b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializers.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.parcelize.serializers.ParcelizeExtensionBase.Companion.CREATOR_NAME interface IrParcelSerializer { fun AndroidIrBuilder.readParcel(parcel: IrValueDeclaration): IrExpression @@ -189,13 +188,7 @@ class IrCharSequenceParcelSerializer : IrParcelSerializer { // Parcel serializer for Parcelables in the same module, which accesses the writeToParcel/createFromParcel methods without reflection. class IrEfficientParcelableParcelSerializer(private val irClass: IrClass) : IrParcelSerializer { override fun AndroidIrBuilder.readParcel(parcel: IrValueDeclaration): IrExpression { - val creator: IrExpression = irClass.fields.find { it.name == CREATOR_NAME }?.let { creatorField -> - irGetField(null, creatorField) - } ?: irCall(irClass.creatorGetter!!).apply { - dispatchReceiver = irGetObject(irClass.companionObject()!!.symbol) - } - - return parcelableCreatorCreateFromParcel(creator, irGet(parcel)) + return parcelableCreatorCreateFromParcel(getParcelableCreator(irClass), irGet(parcel)) } override fun AndroidIrBuilder.writeParcel(parcel: IrValueDeclaration, flags: IrValueDeclaration, value: IrExpression): IrExpression { diff --git a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/ParcelizeIrTransformer.kt b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/ParcelizeIrTransformer.kt index 0033ff977d9..4f9fb52b390 100644 --- a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/ParcelizeIrTransformer.kt +++ b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/ParcelizeIrTransformer.kt @@ -59,8 +59,29 @@ class ParcelizeIrTransformer(private val context: IrPluginContext, private val a deferredOperations.forEach { it() } // Remap broken stubs, which psi2ir generates for the synthetic descriptors coming from the ParcelizeResolveExtension. + // Replace the `parcelableCreator` intrinsic with a direct field access. moduleFragment.transformChildrenVoid(object : IrElementTransformerVoid() { override fun visitCall(expression: IrCall): IrExpression { + // Handle the `parcelableCreator` intrinsic + val callee = expression.symbol.owner + if ( + callee.dispatchReceiverParameter == null + && callee.extensionReceiverParameter == null + && callee.valueParameters.isEmpty() + && callee.isInline + && callee.fqNameWhenAvailable?.asString() == "kotlinx.parcelize.ParcelableCreatorKt.parcelableCreator" + && callee.typeParameters.singleOrNull()?.let { + it.isReified && it.superTypes.singleOrNull()?.classFqName?.asString() == "android.os.Parcelable" + } == true + ) { + expression.getTypeArgument(0)?.getClass()?.let { parcelableClass -> + androidSymbols.createBuilder(expression.symbol).apply { + return getParcelableCreator(parcelableClass) + } + } + } + + // Remap calls to `describeContents` and `writeToParcel` val remappedSymbol = symbolMap[expression.symbol] ?: return super.visitCall(expression) return IrCallImpl( diff --git a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/irUtils.kt b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/irUtils.kt index c467cac229f..23f78bc9d2a 100644 --- a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/irUtils.kt +++ b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/irUtils.kt @@ -7,17 +7,23 @@ package org.jetbrains.kotlin.parcelize.ir import org.jetbrains.kotlin.backend.common.ir.allOverridden import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound +import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.ir.IrBuiltIns +import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* +import org.jetbrains.kotlin.ir.builders.declarations.addField +import org.jetbrains.kotlin.ir.builders.declarations.buildField import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.impl.IrClassReferenceImpl import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol +import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.parcelize.ANDROID_PARCELABLE_CLASS_FQNAME import org.jetbrains.kotlin.parcelize.ANDROID_PARCELABLE_CREATOR_CLASS_FQNAME import org.jetbrains.kotlin.parcelize.PARCELER_FQNAME @@ -103,6 +109,36 @@ fun IrBuilderWithScope.parcelableCreatorCreateFromParcel(creator: IrExpression, } } +// Construct an expression to access the parcelable creator field in the given class. +fun AndroidIrBuilder.getParcelableCreator(irClass: IrClass): IrExpression { + // For classes annotated with `Parcelize` in the same module we can + // use the creator field directly, since we add it ourselves. + irClass.fields.find { it.name == CREATOR_NAME }?.let { creatorField -> + return irGetField(null, creatorField) + } + + // For parcelable classes which do not use `Parcelize`, the creator field + // will be present as a `JvmField` on the companion object. + irClass.creatorGetter?.let { getter -> + return irCall(getter).apply { + dispatchReceiver = irGetObject(irClass.companionObject()!!.symbol) + } + } + + // For classes in different modules, the creator field may not exist, + // since static fields are not present in the Kotlin metadata. + // As a workaround we create a synthetic field here together with a + // field access. + val creatorType = androidSymbols.androidOsParcelableCreator.typeWith(irClass.symbol.starProjectedType) + val creatorField = irClass.factory.createField( + UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB, + IrFieldSymbolImpl(), CREATOR_NAME, creatorType, DescriptorVisibilities.PUBLIC, + isFinal = true, isExternal = false, isStatic = true, + ).also { it.parent = irClass } + + return irGetField(null, creatorField) +} + // Find a named function declaration which overrides the corresponding function in [Parceler]. // This is more reliable than trying to match the functions signature ourselves, since the frontend // has already done the work. diff --git a/plugins/parcelize/parcelize-compiler/testData/box/allPrimitiveTypes.kt b/plugins/parcelize/parcelize-compiler/testData/box/allPrimitiveTypes.kt index 01faab7f0ec..a503b3a2b5f 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/allPrimitiveTypes.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/allPrimitiveTypes.kt @@ -53,8 +53,9 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) - val second2 = readFromParcel(parcel) + val parcelableCreator = parcelableCreator() + val first2 = parcelableCreator.createFromParcel(parcel) + val second2 = parcelableCreator.createFromParcel(parcel) assert(first == first2) assert(second == second2) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/allUnsignedTypes.kt b/plugins/parcelize/parcelize-compiler/testData/box/allUnsignedTypes.kt index d9e2fa979f5..c7867945af6 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/allUnsignedTypes.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/allUnsignedTypes.kt @@ -36,9 +36,10 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) - val second2 = readFromParcel(parcel) - val third2 = readFromParcel(parcel) + val parcelableCreator = parcelableCreator() + val first2 = parcelableCreator.createFromParcel(parcel) + val second2 = parcelableCreator.createFromParcel(parcel) + val third2 = parcelableCreator.createFromParcel(parcel) assert(first == first2) assert(second == second2) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/arraySimple.kt b/plugins/parcelize/parcelize-compiler/testData/box/arraySimple.kt index 819c9b48e9c..7bc468502e1 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/arraySimple.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/arraySimple.kt @@ -33,7 +33,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) + val first2 = parcelableCreator().createFromParcel(parcel) assert(first == first2) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/arrays.kt b/plugins/parcelize/parcelize-compiler/testData/box/arrays.kt index d0a52705cae..85cdc1c5ae4 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/arrays.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/arrays.kt @@ -71,7 +71,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) + val first2 = parcelableCreator().createFromParcel(parcel) assert(first == first2) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/binder.kt b/plugins/parcelize/parcelize-compiler/testData/box/binder.kt index 880f18603e4..26607642f63 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/binder.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/binder.kt @@ -37,5 +37,5 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/boxedTypes.kt b/plugins/parcelize/parcelize-compiler/testData/box/boxedTypes.kt index 359d93f5835..d4191daca66 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/boxedTypes.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/boxedTypes.kt @@ -36,7 +36,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) + val first2 = parcelableCreator().createFromParcel(parcel) assert(first == first2) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/bundle.kt b/plugins/parcelize/parcelize-compiler/testData/box/bundle.kt index c1b83d9f8e5..045ff224aed 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/bundle.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/bundle.kt @@ -19,7 +19,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) assert(compareBundles(test.a, test2.a)) } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/charSequence.kt b/plugins/parcelize/parcelize-compiler/testData/box/charSequence.kt index 79456cbc108..a7874167ed3 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/charSequence.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/charSequence.kt @@ -19,7 +19,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) assert(test.simple.toString() == test2.simple.toString()) assert(test.spanned.toString() == test2.spanned.toString()) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/customNewArray.kt b/plugins/parcelize/parcelize-compiler/testData/box/customNewArray.kt index a7639a1b7c5..253272052b7 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/customNewArray.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/customNewArray.kt @@ -31,7 +31,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val creator = User::class.java.getDeclaredField("CREATOR").get(null) as Parcelable.Creator + val creator = parcelableCreator() val result = parcel.createTypedArray(creator) assert(result.size == 2) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/customParcelable.kt b/plugins/parcelize/parcelize-compiler/testData/box/customParcelable.kt index b73a8609681..c652052a0bd 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/customParcelable.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/customParcelable.kt @@ -31,7 +31,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val userParcelable2 = readFromParcel(parcel) + val userParcelable2 = parcelableCreator().createFromParcel(parcel) assert(userParcelable.user.name == userParcelable2.user.name) assert(userParcelable2.user.age == 0) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/customParcelerScoping.kt b/plugins/parcelize/parcelize-compiler/testData/box/customParcelerScoping.kt index 7fb8fe35caf..58e69f0c1e4 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/customParcelerScoping.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/customParcelerScoping.kt @@ -36,7 +36,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) assert(test2.a == -test.a) assert(test2.b == -test.b) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/customSerializerBoxing.kt b/plugins/parcelize/parcelize-compiler/testData/box/customSerializerBoxing.kt index c690d172450..8638bca475f 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/customSerializerBoxing.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/customSerializerBoxing.kt @@ -41,7 +41,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) println(test.toString()) println(test2.toString()) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/customSerializerSimple.kt b/plugins/parcelize/parcelize-compiler/testData/box/customSerializerSimple.kt index 0935cc90112..689120cdae3 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/customSerializerSimple.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/customSerializerSimple.kt @@ -42,7 +42,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) assert(test.a == "Abc" && test.b == "Abc" && test.c == "Abc" && test.d == "Abc") assert(test2.a == "3" && test2.b == "3" && test2.c == "Abc" && test2.d == "ABC") diff --git a/plugins/parcelize/parcelize-compiler/testData/box/customSerializerWriteWith.kt b/plugins/parcelize/parcelize-compiler/testData/box/customSerializerWriteWith.kt index bc8f95b7a3b..9e908886cbb 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/customSerializerWriteWith.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/customSerializerWriteWith.kt @@ -43,7 +43,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) with (test) { assert(a == "Abc" && b == "Abc" && c == listOf("A", "bc") && d == listOf("A", "bc") && e == listOf("A", "bc")) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/customSimple.kt b/plugins/parcelize/parcelize-compiler/testData/box/customSimple.kt index 2ba8456562b..19a6a89779b 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/customSimple.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/customSimple.kt @@ -30,7 +30,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val user2 = readFromParcel(parcel) + val user2 = parcelableCreator().createFromParcel(parcel) assert(user.firstName == user2.firstName) assert(user.secondName == user2.secondName) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/enumObject.kt b/plugins/parcelize/parcelize-compiler/testData/box/enumObject.kt index b9d74fcd1b3..adc95161159 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/enumObject.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/enumObject.kt @@ -27,8 +27,8 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val black2 = readFromParcel(parcel) - val obj2 = readFromParcel(parcel) + val black2 = parcelableCreator().createFromParcel(parcel) + val obj2 = parcelableCreator().createFromParcel(parcel) println(black2) println(obj2) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/enums.kt b/plugins/parcelize/parcelize-compiler/testData/box/enums.kt index 41217b43a3b..9effb0ae62f 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/enums.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/enums.kt @@ -22,6 +22,6 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) assert(test == test2) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/exceptions.kt b/plugins/parcelize/parcelize-compiler/testData/box/exceptions.kt index 8571e465627..e3428b5bef5 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/exceptions.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/exceptions.kt @@ -21,5 +21,5 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/functions.kt b/plugins/parcelize/parcelize-compiler/testData/box/functions.kt index e99bce084a5..454c3be8738 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/functions.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/functions.kt @@ -18,7 +18,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) assert(test.callback() == 1) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/genericParcelable.kt b/plugins/parcelize/parcelize-compiler/testData/box/genericParcelable.kt index 92801be1fc5..df523e91d6c 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/genericParcelable.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/genericParcelable.kt @@ -20,7 +20,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel>(parcel) + val test2 = parcelableCreator>().createFromParcel(parcel) assert(test.title == test2.title) assert(test2.faTitle.size() == 0) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/generics.kt b/plugins/parcelize/parcelize-compiler/testData/box/generics.kt index 3d9ec8fb6fe..fc58273f2fb 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/generics.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/generics.kt @@ -22,6 +22,6 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val boxLoaded = readFromParcel>(parcel) + val boxLoaded = parcelableCreator>().createFromParcel(parcel) assert(box == boxLoaded) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/intArray.kt b/plugins/parcelize/parcelize-compiler/testData/box/intArray.kt index 7d0e0d1a9d8..2ab6e7a985a 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/intArray.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/intArray.kt @@ -34,6 +34,6 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val film2 = readFromParcel(parcel) + val film2 = parcelableCreator().createFromParcel(parcel) assert(film == film2) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/kt19747_2.kt b/plugins/parcelize/parcelize-compiler/testData/box/kt19747_2.kt index 448443dffe9..074fe24ac52 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/kt19747_2.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/kt19747_2.kt @@ -27,7 +27,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) assert(test.j.j1 == test2.j.j1) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/kt19749.kt b/plugins/parcelize/parcelize-compiler/testData/box/kt19749.kt index 7cbcfd92ad4..9753873d5bd 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/kt19749.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/kt19749.kt @@ -23,7 +23,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) assert(test.m.m1 == test2.m.m1) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/kt19853.kt b/plugins/parcelize/parcelize-compiler/testData/box/kt19853.kt new file mode 100644 index 00000000000..6e17f5176ad --- /dev/null +++ b/plugins/parcelize/parcelize-compiler/testData/box/kt19853.kt @@ -0,0 +1,26 @@ +// WITH_RUNTIME + +@file:JvmName("TestKt") +package test + +import kotlinx.parcelize.* +import android.os.Parcel +import android.os.Parcelable + +@Parcelize +class A(val value: Int) : Parcelable + +fun box() = parcelTest { parcel -> + parcel.writeTypedList(listOf(A(0), A(1))) + + val bytes = parcel.marshall() + parcel.unmarshall(bytes, 0, bytes.size) + parcel.setDataPosition(0) + + val creator = parcelableCreator() + val deserialized = mutableListOf() + parcel.readTypedList(deserialized, creator) + assert(deserialized.size == 2) + assert(deserialized[0].value == 0) + assert(deserialized[1].value == 1) +} diff --git a/plugins/parcelize/parcelize-compiler/testData/box/kt20002.kt b/plugins/parcelize/parcelize-compiler/testData/box/kt20002.kt index 037ae43a490..dd6221191ba 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/kt20002.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/kt20002.kt @@ -34,7 +34,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) + val first2 = parcelableCreator().createFromParcel(parcel) assert(first == first2) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/kt20021.kt b/plugins/parcelize/parcelize-compiler/testData/box/kt20021.kt index b24e291ac5d..5ca2adaa00a 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/kt20021.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/kt20021.kt @@ -41,7 +41,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) + val first2 = parcelableCreator().createFromParcel(parcel) assert(first.parcelableEnum == ParcelableEnum.THREE) assert(first2.parcelableEnum == ParcelableEnum.ONE) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/kt25839.kt b/plugins/parcelize/parcelize-compiler/testData/box/kt25839.kt index bd55fd5ea5c..8af4c219ae4 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/kt25839.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/kt25839.kt @@ -24,6 +24,6 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - readFromParcel(parcel) - readFromParcel(parcel) + parcelableCreator().createFromParcel(parcel) + parcelableCreator().createFromParcel(parcel) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/kt26221.kt b/plugins/parcelize/parcelize-compiler/testData/box/kt26221.kt index 8852244e767..2b926bacab6 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/kt26221.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/kt26221.kt @@ -30,7 +30,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val foo2 = readFromParcel(parcel) + val foo2 = parcelableCreator().createFromParcel(parcel) assert(foo2.values.size() == 1) assert(foo2.values.get(1) != null) // SparseArray.contains was only added in Android R assert(foo2.values.get(1).size() == 1) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/kt36658.kt b/plugins/parcelize/parcelize-compiler/testData/box/kt36658.kt index 0113db9fc81..586cc350e1d 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/kt36658.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/kt36658.kt @@ -19,5 +19,5 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - readFromParcel(parcel) + parcelableCreator().createFromParcel(parcel) } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/kt41553.kt b/plugins/parcelize/parcelize-compiler/testData/box/kt41553.kt index 955fc5ba663..463d60d9222 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/kt41553.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/kt41553.kt @@ -21,9 +21,10 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val a2 = readFromParcel(parcel) + val parcelableCreator = parcelableCreator() + val a2 = parcelableCreator.createFromParcel(parcel) assert(a2.params != null) assert(Arrays.equals(a1.params!!, a2.params!!)) - val b2 = readFromParcel(parcel) + val b2 = parcelableCreator.createFromParcel(parcel) assert(b1 == b2) } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/kt41553_2.kt b/plugins/parcelize/parcelize-compiler/testData/box/kt41553_2.kt index b1abaddf833..6869fb4043b 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/kt41553_2.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/kt41553_2.kt @@ -21,9 +21,10 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val a2 = readFromParcel(parcel) + val parcelableCreator = parcelableCreator() + val a2 = parcelableCreator.createFromParcel(parcel) assert(a2.params != null) assert(Arrays.equals(a1.params!!, a2.params!!)) - val b2 = readFromParcel(parcel) + val b2 = parcelableCreator.createFromParcel(parcel) assert(b1 == b2) } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/kt46567.kt b/plugins/parcelize/parcelize-compiler/testData/box/kt46567.kt index 2b0bb4f2636..df3b275df0b 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/kt46567.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/kt46567.kt @@ -59,6 +59,6 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val a2 = readFromParcel(parcel) + val a2 = parcelableCreator().createFromParcel(parcel) assert(a1.pair == a2.pair) } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/listKinds.kt b/plugins/parcelize/parcelize-compiler/testData/box/listKinds.kt index 8883420c0f0..b2f3fdc8513 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/listKinds.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/listKinds.kt @@ -45,7 +45,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) + val first2 = parcelableCreator().createFromParcel(parcel) assert(first == first2) assert((first.d as LinkedList<*>).size == 1) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/listSimple.kt b/plugins/parcelize/parcelize-compiler/testData/box/listSimple.kt index 5029aa8ec54..e4c72920fb1 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/listSimple.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/listSimple.kt @@ -19,7 +19,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) + val first2 = parcelableCreator().createFromParcel(parcel) assert(first == first2) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/lists.kt b/plugins/parcelize/parcelize-compiler/testData/box/lists.kt index 3ddbd31982a..e56e8ebae0a 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/lists.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/lists.kt @@ -33,7 +33,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) + val first2 = parcelableCreator().createFromParcel(parcel) assert(first == first2) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/mapKinds.kt b/plugins/parcelize/parcelize-compiler/testData/box/mapKinds.kt index d714822ef81..49380900bb5 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/mapKinds.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/mapKinds.kt @@ -37,7 +37,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) + val first2 = parcelableCreator().createFromParcel(parcel) assert(first == first2) assert((first.c as HashMap<*, *>).size == 1) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/mapSimple.kt b/plugins/parcelize/parcelize-compiler/testData/box/mapSimple.kt index a6ca24bb230..416fcbf3718 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/mapSimple.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/mapSimple.kt @@ -19,7 +19,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) + val first2 = parcelableCreator().createFromParcel(parcel) assert(first == first2) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/maps.kt b/plugins/parcelize/parcelize-compiler/testData/box/maps.kt index b758d112ab4..8e6ac115a19 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/maps.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/maps.kt @@ -35,7 +35,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) + val first2 = parcelableCreator().createFromParcel(parcel) assert(first == first2) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/nestedArrays.kt b/plugins/parcelize/parcelize-compiler/testData/box/nestedArrays.kt index 8add9ddd3c5..688034905fb 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/nestedArrays.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/nestedArrays.kt @@ -20,7 +20,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val second = readFromParcel(parcel) + val second = parcelableCreator().createFromParcel(parcel) assert(second.data.size == 1) assert(Arrays.equals(second.data[0], arrayOf(0, 1))) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/nestedLists.kt b/plugins/parcelize/parcelize-compiler/testData/box/nestedLists.kt index def43a46c90..7e38378db6c 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/nestedLists.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/nestedLists.kt @@ -20,7 +20,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val second = readFromParcel(parcel) + val second = parcelableCreator().createFromParcel(parcel) assert(second.data.size == 1) assert(Arrays.equals(second.data[0], arrayOf(0, 1))) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/nestedMaps.kt b/plugins/parcelize/parcelize-compiler/testData/box/nestedMaps.kt index fa2bfe03d93..ed6e8dba74d 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/nestedMaps.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/nestedMaps.kt @@ -20,7 +20,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val second = readFromParcel(parcel) + val second = parcelableCreator().createFromParcel(parcel) assert(second.data.size == 1) val entry = second.data.entries.single() assert(Arrays.equals(entry.key, arrayOf(0))) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/nestedParcelable.kt b/plugins/parcelize/parcelize-compiler/testData/box/nestedParcelable.kt index 75e476f46a0..b7588ab2557 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/nestedParcelable.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/nestedParcelable.kt @@ -29,6 +29,6 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) assert(test == test2) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/nestedSparseArrays.kt b/plugins/parcelize/parcelize-compiler/testData/box/nestedSparseArrays.kt index c6bb3c71b7e..896d01878cf 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/nestedSparseArrays.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/nestedSparseArrays.kt @@ -24,7 +24,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val second = readFromParcel(parcel) + val second = parcelableCreator().createFromParcel(parcel) assert(second.data.size() == 1) assert(Arrays.equals(second.data.get(0), arrayOf(0, 1))) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/nestedSparseArrays2.kt b/plugins/parcelize/parcelize-compiler/testData/box/nestedSparseArrays2.kt index 2a4741cfa69..32f694ff848 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/nestedSparseArrays2.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/nestedSparseArrays2.kt @@ -27,7 +27,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val second = readFromParcel(parcel) + val second = parcelableCreator().createFromParcel(parcel) assert(second.values.size() == 1) val secondInnerArray = second.values.get(10) assert(secondInnerArray.size() == 1) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/newArray.kt b/plugins/parcelize/parcelize-compiler/testData/box/newArray.kt index 4ed9cc868ff..ed72f535fed 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/newArray.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/newArray.kt @@ -20,7 +20,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val creator = User::class.java.getDeclaredField("CREATOR").get(null) as Parcelable.Creator + val creator = parcelableCreator() val result = parcel.createTypedArray(creator) assert(result.size == 2) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/newArrayParceler.kt b/plugins/parcelize/parcelize-compiler/testData/box/newArrayParceler.kt index e45a357534e..eabf1e78276 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/newArrayParceler.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/newArrayParceler.kt @@ -35,7 +35,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val creator = User::class.java.getDeclaredField("CREATOR").get(null) as Parcelable.Creator + val creator = parcelableCreator() val result = parcel.createTypedArray(creator) assert(result.size == 3) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/nullableTypes.kt b/plugins/parcelize/parcelize-compiler/testData/box/nullableTypes.kt index e165b3f8ab2..3014523174a 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/nullableTypes.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/nullableTypes.kt @@ -30,8 +30,9 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) - val second2 = readFromParcel(parcel) + val parcelableCreator = parcelableCreator() + val first2 = parcelableCreator.createFromParcel(parcel) + val second2 = parcelableCreator.createFromParcel(parcel) assert(first == first2) assert(second == second2) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/nullableTypesSimple.kt b/plugins/parcelize/parcelize-compiler/testData/box/nullableTypesSimple.kt index 7b777e7ccda..3b0f2e43068 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/nullableTypesSimple.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/nullableTypesSimple.kt @@ -21,8 +21,9 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) - val second2 = readFromParcel(parcel) + val parcelableCreator = parcelableCreator() + val first2 = parcelableCreator.createFromParcel(parcel) + val second2 = parcelableCreator.createFromParcel(parcel) assert(first == first2) assert(second == second2) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/objects.kt b/plugins/parcelize/parcelize-compiler/testData/box/objects.kt index 9cd0643c5f5..28ad0eff59b 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/objects.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/objects.kt @@ -26,6 +26,6 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) assert(test == test2) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/parcelableValueClass.kt b/plugins/parcelize/parcelize-compiler/testData/box/parcelableValueClass.kt index 58309b2c224..b5d728c4fee 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/parcelableValueClass.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/parcelableValueClass.kt @@ -34,6 +34,6 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val data2 = readFromParcel(parcel) + val data2 = parcelableCreator().createFromParcel(parcel) assert(data2.uuid.uuid == data.uuid.uuid) } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/parcelizeCustomValueClass.kt b/plugins/parcelize/parcelize-compiler/testData/box/parcelizeCustomValueClass.kt index 97710c9fab1..aa465c8f244 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/parcelizeCustomValueClass.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/parcelizeCustomValueClass.kt @@ -33,6 +33,6 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val data2 = readFromParcel(parcel) + val data2 = parcelableCreator().createFromParcel(parcel) assert(data2.uuid.uuid == data.uuid.uuid) } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/persistableBundle.kt b/plugins/parcelize/parcelize-compiler/testData/box/persistableBundle.kt index a7bba12cb56..4e29156d64b 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/persistableBundle.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/persistableBundle.kt @@ -25,7 +25,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) assert(compareBundles(test.a, test2.a)) } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/primitiveTypes.kt b/plugins/parcelize/parcelize-compiler/testData/box/primitiveTypes.kt index 9bcc086d4e7..dd4eb06571b 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/primitiveTypes.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/primitiveTypes.kt @@ -31,8 +31,9 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val first2 = readFromParcel(parcel) - val second2 = readFromParcel(parcel) + val parcelableCreator = parcelableCreator() + val first2 = parcelableCreator.createFromParcel(parcel) + val second2 = parcelableCreator.createFromParcel(parcel) assert(first == first2) assert(second == second2) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/privateConstructor.kt b/plugins/parcelize/parcelize-compiler/testData/box/privateConstructor.kt index 847ba4fbbcf..54856f247a9 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/privateConstructor.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/privateConstructor.kt @@ -22,6 +22,6 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val data = readFromParcel(parcel) + val data = parcelableCreator().createFromParcel(parcel) assert(data.value == "OK") } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/recursiveGenerics.kt b/plugins/parcelize/parcelize-compiler/testData/box/recursiveGenerics.kt index 2aeca09da14..b5610a2aa1e 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/recursiveGenerics.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/recursiveGenerics.kt @@ -30,6 +30,6 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) assert(test == test2) } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/sealedClass.kt b/plugins/parcelize/parcelize-compiler/testData/box/sealedClass.kt index eae381fa5c9..863c614c22b 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/sealedClass.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/sealedClass.kt @@ -27,7 +27,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val second = readFromParcel(parcel) + val second = parcelableCreator().createFromParcel(parcel) assert(first == second) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/simple.kt b/plugins/parcelize/parcelize-compiler/testData/box/simple.kt index 4462e898ad0..893ce3a99c4 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/simple.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/simple.kt @@ -20,6 +20,6 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val user2 = readFromParcel(parcel) + val user2 = parcelableCreator().createFromParcel(parcel) assert(user == user2) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/simpleDeprecated.kt b/plugins/parcelize/parcelize-compiler/testData/box/simpleDeprecated.kt index 7c003a9a024..a18720aad52 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/simpleDeprecated.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/simpleDeprecated.kt @@ -20,6 +20,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val user2 = readFromParcel(parcel) + val creator = User::class.java.getDeclaredField("CREATOR").get(null) as Parcelable.Creator + val user2 = creator.createFromParcel(parcel) assert(user == user2) } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/sparseArrays.kt b/plugins/parcelize/parcelize-compiler/testData/box/sparseArrays.kt index 4b2673129a1..a222b622978 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/sparseArrays.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/sparseArrays.kt @@ -27,7 +27,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val user2 = readFromParcel(parcel) + val user2 = parcelableCreator().createFromParcel(parcel) assert(compareSparseIntArrays(user.a, user2.a)) assert(compareSparseLongArrays(user.b, user2.b)) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/sparseBooleanArray.kt b/plugins/parcelize/parcelize-compiler/testData/box/sparseBooleanArray.kt index c97e04aa8dc..afba2858ac3 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/sparseBooleanArray.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/sparseBooleanArray.kt @@ -19,7 +19,7 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val test2 = readFromParcel(parcel) + val test2 = parcelableCreator().createFromParcel(parcel) assert(compareSparseBooleanArrays(test.a, test2.a)) } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/typeParameters.kt b/plugins/parcelize/parcelize-compiler/testData/box/typeParameters.kt index 2e037ed1791..98cf302d40c 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/typeParameters.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/typeParameters.kt @@ -29,12 +29,12 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val covariant2 = readFromParcel>(parcel) + val covariant2 = parcelableCreator>().createFromParcel(parcel) assert(covariant2.block() == "OK") - val contravariant2 = readFromParcel>(parcel) + val contravariant2 = parcelableCreator>().createFromParcel(parcel) assert(contravariant2.block("OK")) - val invariant2 = readFromParcel>(parcel) + val invariant2 = parcelableCreator>().createFromParcel(parcel) assert(invariant2.s.toString() == "OK") } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/valueClassWrapper.kt b/plugins/parcelize/parcelize-compiler/testData/box/valueClassWrapper.kt index b6243ffbc92..68adf4f60ac 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/valueClassWrapper.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/valueClassWrapper.kt @@ -29,9 +29,9 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val data2 = readFromParcel(parcel) + val data2 = parcelableCreator().createFromParcel(parcel) assert(data2 == data) - val none2 = readFromParcel(parcel) + val none2 = parcelableCreator().createFromParcel(parcel) assert(none2 == none) } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/valueClasses.kt b/plugins/parcelize/parcelize-compiler/testData/box/valueClasses.kt index 7dc338a02e7..a82be5777c6 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/valueClasses.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/valueClasses.kt @@ -49,6 +49,6 @@ fun box() = parcelTest { parcel -> parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) - val data2 = readFromParcel(parcel) + val data2 = parcelableCreator().createFromParcel(parcel) assert(data2 == data) } diff --git a/plugins/parcelize/parcelize-compiler/testData/boxLib.kt b/plugins/parcelize/parcelize-compiler/testData/boxLib.kt index b24f2513a9b..ab5be75c4b7 100644 --- a/plugins/parcelize/parcelize-compiler/testData/boxLib.kt +++ b/plugins/parcelize/parcelize-compiler/testData/boxLib.kt @@ -11,8 +11,3 @@ fun parcelTest(block: (Parcel) -> Unit): String { parcel.recycle() } } - -inline fun readFromParcel(parcel: Parcel): T { - val creator = T::class.java.getDeclaredField("CREATOR").get(null) - return creator::class.java.getDeclaredMethod("createFromParcel", Parcel::class.java).invoke(creator, parcel) as T -} \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/codegen/parcelableCreator.ir.txt b/plugins/parcelize/parcelize-compiler/testData/codegen/parcelableCreator.ir.txt new file mode 100644 index 00000000000..e6da469293d --- /dev/null +++ b/plugins/parcelize/parcelize-compiler/testData/codegen/parcelableCreator.ir.txt @@ -0,0 +1,207 @@ +public final class A$Creator : java/lang/Object, android/os/Parcelable$Creator { + public void () + + public final A createFromParcel(android.os.Parcel parcel) + + public java.lang.Object createFromParcel(android.os.Parcel source) + + public final A[] newArray(int size) + + public java.lang.Object[] newArray(int size) +} + +public final class A : java/lang/Object, android/os/Parcelable { + public final static android.os.Parcelable$Creator CREATOR + + private final int value + + static void () + + public void (int value) + + public int describeContents() + + public final int getValue() + + public void writeToParcel(android.os.Parcel out, int flags) +} + +public final class B$Creator : java/lang/Object, android/os/Parcelable$Creator { + public void () + + public final B createFromParcel(android.os.Parcel parcel) + + public java.lang.Object createFromParcel(android.os.Parcel source) + + public final B[] newArray(int size) + + public java.lang.Object[] newArray(int size) +} + +public final class B : java/lang/Object, android/os/Parcelable { + public final static android.os.Parcelable$Creator CREATOR + + static void () + + public void () + + public int describeContents() + + public void writeToParcel(android.os.Parcel out, int flags) +} + +public final class C$Creator : java/lang/Object, android/os/Parcelable$Creator { + public void () + + public final C createFromParcel(android.os.Parcel parcel) + + public java.lang.Object createFromParcel(android.os.Parcel source) + + public final C[] newArray(int size) + + public java.lang.Object[] newArray(int size) +} + +public final class C : java/lang/Object, android/os/Parcelable { + public final static android.os.Parcelable$Creator CREATOR + + public final static C INSTANCE + + static void () + + private void () + + public int describeContents() + + public void writeToParcel(android.os.Parcel out, int flags) +} + +public final class ParcelableCreatorKt : java/lang/Object { + public final static void test1() { + GETSTATIC (A, CREATOR, Landroid/os/Parcelable$Creator;) + POP + GETSTATIC (B, CREATOR, Landroid/os/Parcelable$Creator;) + POP + GETSTATIC (C, CREATOR, Landroid/os/Parcelable$Creator;) + POP + LABEL (L0) + LINENUMBER (20) + RETURN + } + + public final static void test2() { + ICONST_0 + ISTORE (0) + LABEL (L0) + LINENUMBER (23) + ICONST_0 + ISTORE (1) + LABEL (L1) + ICONST_4 + LDC (T) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, reifiedOperationMarker, (ILjava/lang/String;)V) + LDC (Landroid/os/Parcelable;) + CHECKCAST + LABEL (L2) + LINENUMBER (30) + LDC (CREATOR) + INVOKEVIRTUAL (java/lang/Class, getDeclaredField, (Ljava/lang/String;)Ljava/lang/reflect/Field;) + ACONST_NULL + INVOKEVIRTUAL (java/lang/reflect/Field, get, (Ljava/lang/Object;)Ljava/lang/Object;) + ASTORE (2) + ALOAD (2) + INSTANCEOF + IFEQ (L3) + ALOAD (2) + CHECKCAST + GOTO (L4) + LABEL (L3) + ACONST_NULL + LABEL (L4) + ASTORE (3) + ALOAD (3) + IFNONNULL (L5) + LABEL (L6) + LINENUMBER (31) + NEW + DUP + LDC (Could not access CREATOR field in class ) + ICONST_4 + LDC (T) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, reifiedOperationMarker, (ILjava/lang/String;)V) + LDC (Landroid/os/Parcelable;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + INVOKEINTERFACE (kotlin/reflect/KClass, getSimpleName, ()Ljava/lang/String;) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, stringPlus, (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;) + INVOKESPECIAL (java/lang/IllegalArgumentException, , (Ljava/lang/String;)V) + ATHROW + LABEL (L5) + LINENUMBER (30) + ALOAD (3) + CHECKCAST + LABEL (L7) + LINENUMBER (31) + NOP + LABEL (L8) + POP + LABEL (L9) + LINENUMBER (24) + RETURN + LABEL (L10) + } + + public final static void test3() { + LABEL (L0) + LINENUMBER (27) + ICONST_0 + ISTORE (0) + LABEL (L1) + LINENUMBER (32) + ICONST_0 + ISTORE (1) + LABEL (L2) + LDC (LA;) + LABEL (L3) + LINENUMBER (33) + LDC (CREATOR) + INVOKEVIRTUAL (java/lang/Class, getDeclaredField, (Ljava/lang/String;)Ljava/lang/reflect/Field;) + ACONST_NULL + INVOKEVIRTUAL (java/lang/reflect/Field, get, (Ljava/lang/Object;)Ljava/lang/Object;) + ASTORE (2) + ALOAD (2) + INSTANCEOF + IFEQ (L4) + ALOAD (2) + CHECKCAST + GOTO (L5) + LABEL (L4) + ACONST_NULL + LABEL (L5) + ASTORE (3) + ALOAD (3) + IFNONNULL (L6) + LABEL (L7) + LINENUMBER (34) + NEW + DUP + LDC (Could not access CREATOR field in class ) + LDC (LA;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + INVOKEINTERFACE (kotlin/reflect/KClass, getSimpleName, ()Ljava/lang/String;) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, stringPlus, (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;) + INVOKESPECIAL (java/lang/IllegalArgumentException, , (Ljava/lang/String;)V) + ATHROW + LABEL (L6) + LINENUMBER (33) + NOP + LABEL (L8) + LINENUMBER (34) + NOP + LABEL (L9) + LINENUMBER (35) + NOP + LABEL (L10) + LINENUMBER (28) + RETURN + } +} diff --git a/plugins/parcelize/parcelize-compiler/testData/codegen/parcelableCreator.kt b/plugins/parcelize/parcelize-compiler/testData/codegen/parcelableCreator.kt new file mode 100644 index 00000000000..1bbbef5fd35 --- /dev/null +++ b/plugins/parcelize/parcelize-compiler/testData/codegen/parcelableCreator.kt @@ -0,0 +1,28 @@ +// CURIOUS_ABOUT test1, test2, test3 +// WITH_RUNTIME + +import kotlinx.parcelize.* +import android.os.Parcelable + +@Parcelize +class A(val value: Int) : Parcelable + +@Parcelize +class B : Parcelable + +@Parcelize +object C : Parcelable + +fun test1() { + parcelableCreator() + parcelableCreator() + parcelableCreator() +} + +inline fun test2() { + parcelableCreator() +} + +fun test3() { + test2() +} diff --git a/plugins/parcelize/parcelize-compiler/testData/codegen/parcelableCreator.txt b/plugins/parcelize/parcelize-compiler/testData/codegen/parcelableCreator.txt new file mode 100644 index 00000000000..d9675c3ca65 --- /dev/null +++ b/plugins/parcelize/parcelize-compiler/testData/codegen/parcelableCreator.txt @@ -0,0 +1,327 @@ +public final class A$Creator : java/lang/Object, android/os/Parcelable$Creator { + public void () + + public final A createFromParcel(android.os.Parcel in) + + public java.lang.Object createFromParcel(android.os.Parcel p0) + + public final A[] newArray(int size) + + public java.lang.Object[] newArray(int p0) +} + +public final class A : java/lang/Object, android/os/Parcelable { + public final static android.os.Parcelable$Creator CREATOR + + private final int value + + static void () + + public void (int value) + + public int describeContents() + + public final int getValue() + + public void writeToParcel(android.os.Parcel parcel, int flags) +} + +public final class B$Creator : java/lang/Object, android/os/Parcelable$Creator { + public void () + + public final B createFromParcel(android.os.Parcel in) + + public java.lang.Object createFromParcel(android.os.Parcel p0) + + public final B[] newArray(int size) + + public java.lang.Object[] newArray(int p0) +} + +public final class B : java/lang/Object, android/os/Parcelable { + public final static android.os.Parcelable$Creator CREATOR + + static void () + + public void () + + public int describeContents() + + public void writeToParcel(android.os.Parcel parcel, int flags) +} + +public final class C$Creator : java/lang/Object, android/os/Parcelable$Creator { + public void () + + public final C createFromParcel(android.os.Parcel in) + + public java.lang.Object createFromParcel(android.os.Parcel p0) + + public final C[] newArray(int size) + + public java.lang.Object[] newArray(int p0) +} + +public final class C : java/lang/Object, android/os/Parcelable { + public final static android.os.Parcelable$Creator CREATOR + + public final static C INSTANCE + + static void () + + private void () + + public int describeContents() + + public void writeToParcel(android.os.Parcel parcel, int flags) +} + +public final class ParcelableCreatorKt : java/lang/Object { + public final static void test1() { + LABEL (L0) + LINENUMBER (17) + ICONST_0 + ISTORE (0) + LABEL (L1) + LDC (LA;) + LABEL (L2) + LINENUMBER (30) + LDC (CREATOR) + INVOKEVIRTUAL (java/lang/Class, getDeclaredField, (Ljava/lang/String;)Ljava/lang/reflect/Field;) + ACONST_NULL + INVOKEVIRTUAL (java/lang/reflect/Field, get, (Ljava/lang/Object;)Ljava/lang/Object;) + ASTORE (1) + ALOAD (1) + INSTANCEOF + IFEQ (L3) + ALOAD (1) + CHECKCAST + GOTO (L4) + LABEL (L3) + ACONST_NULL + LABEL (L4) + ASTORE (2) + ALOAD (2) + IFNONNULL (L5) + LABEL (L6) + LINENUMBER (31) + NEW + DUP + LDC (Could not access CREATOR field in class ) + LDC (LA;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + INVOKEINTERFACE (kotlin/reflect/KClass, getSimpleName, ()Ljava/lang/String;) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, stringPlus, (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;) + INVOKESPECIAL (java/lang/IllegalArgumentException, , (Ljava/lang/String;)V) + ATHROW + LABEL (L5) + LINENUMBER (30) + NOP + LABEL (L7) + LINENUMBER (31) + NOP + LABEL (L8) + LINENUMBER (18) + ICONST_0 + ISTORE (0) + LABEL (L9) + LDC (LB;) + LABEL (L10) + LINENUMBER (32) + LDC (CREATOR) + INVOKEVIRTUAL (java/lang/Class, getDeclaredField, (Ljava/lang/String;)Ljava/lang/reflect/Field;) + ACONST_NULL + INVOKEVIRTUAL (java/lang/reflect/Field, get, (Ljava/lang/Object;)Ljava/lang/Object;) + ASTORE (1) + ALOAD (1) + INSTANCEOF + IFEQ (L11) + ALOAD (1) + CHECKCAST + GOTO (L12) + LABEL (L11) + ACONST_NULL + LABEL (L12) + ASTORE (2) + ALOAD (2) + IFNONNULL (L13) + LABEL (L14) + LINENUMBER (33) + NEW + DUP + LDC (Could not access CREATOR field in class ) + LDC (LB;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + INVOKEINTERFACE (kotlin/reflect/KClass, getSimpleName, ()Ljava/lang/String;) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, stringPlus, (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;) + INVOKESPECIAL (java/lang/IllegalArgumentException, , (Ljava/lang/String;)V) + ATHROW + LABEL (L13) + LINENUMBER (32) + NOP + LABEL (L15) + LINENUMBER (33) + NOP + LABEL (L16) + LINENUMBER (19) + ICONST_0 + ISTORE (0) + LABEL (L17) + LDC (LC;) + LABEL (L18) + LINENUMBER (34) + LDC (CREATOR) + INVOKEVIRTUAL (java/lang/Class, getDeclaredField, (Ljava/lang/String;)Ljava/lang/reflect/Field;) + ACONST_NULL + INVOKEVIRTUAL (java/lang/reflect/Field, get, (Ljava/lang/Object;)Ljava/lang/Object;) + ASTORE (1) + ALOAD (1) + INSTANCEOF + IFEQ (L19) + ALOAD (1) + CHECKCAST + GOTO (L20) + LABEL (L19) + ACONST_NULL + LABEL (L20) + ASTORE (2) + ALOAD (2) + IFNONNULL (L21) + LABEL (L22) + LINENUMBER (35) + NEW + DUP + LDC (Could not access CREATOR field in class ) + LDC (LC;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + INVOKEINTERFACE (kotlin/reflect/KClass, getSimpleName, ()Ljava/lang/String;) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, stringPlus, (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;) + INVOKESPECIAL (java/lang/IllegalArgumentException, , (Ljava/lang/String;)V) + ATHROW + LABEL (L21) + LINENUMBER (34) + NOP + LABEL (L23) + LINENUMBER (35) + NOP + LABEL (L24) + LINENUMBER (20) + RETURN + } + + public final static void test2() { + LDC (0) + ISTORE (0) + LABEL (L0) + LINENUMBER (23) + ICONST_0 + ISTORE (1) + LABEL (L1) + ICONST_4 + LDC (T) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, reifiedOperationMarker, (ILjava/lang/String;)V) + LDC (Landroid/os/Parcelable;) + CHECKCAST + LABEL (L2) + LINENUMBER (36) + LDC (CREATOR) + INVOKEVIRTUAL (java/lang/Class, getDeclaredField, (Ljava/lang/String;)Ljava/lang/reflect/Field;) + ACONST_NULL + INVOKEVIRTUAL (java/lang/reflect/Field, get, (Ljava/lang/Object;)Ljava/lang/Object;) + ASTORE (2) + ALOAD (2) + INSTANCEOF + IFEQ (L3) + ALOAD (2) + CHECKCAST + GOTO (L4) + LABEL (L3) + ACONST_NULL + LABEL (L4) + ASTORE (3) + ALOAD (3) + IFNONNULL (L5) + LABEL (L6) + LINENUMBER (37) + NEW + DUP + LDC (Could not access CREATOR field in class ) + ICONST_4 + LDC (T) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, reifiedOperationMarker, (ILjava/lang/String;)V) + LDC (Landroid/os/Parcelable;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + INVOKEINTERFACE (kotlin/reflect/KClass, getSimpleName, ()Ljava/lang/String;) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, stringPlus, (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;) + INVOKESPECIAL (java/lang/IllegalArgumentException, , (Ljava/lang/String;)V) + ATHROW + LABEL (L5) + LINENUMBER (36) + ALOAD (3) + CHECKCAST + LABEL (L7) + LINENUMBER (37) + NOP + LABEL (L8) + POP + LABEL (L9) + LINENUMBER (24) + RETURN + LABEL (L10) + } + + public final static void test3() { + LABEL (L0) + LINENUMBER (27) + ICONST_0 + ISTORE (0) + LABEL (L1) + LINENUMBER (38) + ICONST_0 + ISTORE (1) + LABEL (L2) + LDC (LA;) + LABEL (L3) + LINENUMBER (39) + LDC (CREATOR) + INVOKEVIRTUAL (java/lang/Class, getDeclaredField, (Ljava/lang/String;)Ljava/lang/reflect/Field;) + ACONST_NULL + INVOKEVIRTUAL (java/lang/reflect/Field, get, (Ljava/lang/Object;)Ljava/lang/Object;) + ASTORE (2) + ALOAD (2) + INSTANCEOF + IFEQ (L4) + ALOAD (2) + CHECKCAST + GOTO (L5) + LABEL (L4) + ACONST_NULL + LABEL (L5) + ASTORE (3) + ALOAD (3) + IFNONNULL (L6) + LABEL (L7) + LINENUMBER (40) + NEW + DUP + LDC (Could not access CREATOR field in class ) + LDC (LA;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + INVOKEINTERFACE (kotlin/reflect/KClass, getSimpleName, ()Ljava/lang/String;) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, stringPlus, (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;) + INVOKESPECIAL (java/lang/IllegalArgumentException, , (Ljava/lang/String;)V) + ATHROW + LABEL (L6) + LINENUMBER (39) + NOP + LABEL (L8) + LINENUMBER (40) + NOP + LABEL (L9) + LINENUMBER (41) + NOP + LABEL (L10) + LINENUMBER (28) + RETURN + } +} \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeBoxTestGenerated.java b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeBoxTestGenerated.java index e9022ee3ee5..705e11ecf26 100644 --- a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeBoxTestGenerated.java +++ b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeBoxTestGenerated.java @@ -165,6 +165,11 @@ public class ParcelizeBoxTestGenerated extends AbstractParcelizeBoxTest { runTest("plugins/parcelize/parcelize-compiler/testData/box/kt19749.kt"); } + @TestMetadata("kt19853.kt") + public void testKt19853() throws Exception { + runTest("plugins/parcelize/parcelize-compiler/testData/box/kt19853.kt"); + } + @TestMetadata("kt20002.kt") public void testKt20002() throws Exception { runTest("plugins/parcelize/parcelize-compiler/testData/box/kt20002.kt"); diff --git a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeBytecodeListingTestGenerated.java b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeBytecodeListingTestGenerated.java index 75fce756139..0d4b9b0eb8d 100644 --- a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeBytecodeListingTestGenerated.java +++ b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeBytecodeListingTestGenerated.java @@ -105,6 +105,11 @@ public class ParcelizeBytecodeListingTestGenerated extends AbstractParcelizeByte runTest("plugins/parcelize/parcelize-compiler/testData/codegen/parcelable.kt"); } + @TestMetadata("parcelableCreator.kt") + public void testParcelableCreator() throws Exception { + runTest("plugins/parcelize/parcelize-compiler/testData/codegen/parcelableCreator.kt"); + } + @TestMetadata("serializable.kt") public void testSerializable() throws Exception { runTest("plugins/parcelize/parcelize-compiler/testData/codegen/serializable.kt"); diff --git a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeIrBoxTestGenerated.java b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeIrBoxTestGenerated.java index 87d7a2aee75..679592dcef0 100644 --- a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeIrBoxTestGenerated.java +++ b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeIrBoxTestGenerated.java @@ -165,6 +165,11 @@ public class ParcelizeIrBoxTestGenerated extends AbstractParcelizeIrBoxTest { runTest("plugins/parcelize/parcelize-compiler/testData/box/kt19749.kt"); } + @TestMetadata("kt19853.kt") + public void testKt19853() throws Exception { + runTest("plugins/parcelize/parcelize-compiler/testData/box/kt19853.kt"); + } + @TestMetadata("kt20002.kt") public void testKt20002() throws Exception { runTest("plugins/parcelize/parcelize-compiler/testData/box/kt20002.kt"); diff --git a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeIrBytecodeListingTestGenerated.java b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeIrBytecodeListingTestGenerated.java index 682bf5e4a68..d3ee9672a8d 100644 --- a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeIrBytecodeListingTestGenerated.java +++ b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeIrBytecodeListingTestGenerated.java @@ -105,6 +105,11 @@ public class ParcelizeIrBytecodeListingTestGenerated extends AbstractParcelizeIr runTest("plugins/parcelize/parcelize-compiler/testData/codegen/parcelable.kt"); } + @TestMetadata("parcelableCreator.kt") + public void testParcelableCreator() throws Exception { + runTest("plugins/parcelize/parcelize-compiler/testData/codegen/parcelableCreator.kt"); + } + @TestMetadata("serializable.kt") public void testSerializable() throws Exception { runTest("plugins/parcelize/parcelize-compiler/testData/codegen/serializable.kt"); diff --git a/plugins/parcelize/parcelize-runtime/src/kotlinx/parcelize/parcelableCreator.kt b/plugins/parcelize/parcelize-runtime/src/kotlinx/parcelize/parcelableCreator.kt new file mode 100644 index 00000000000..3e98ff13be7 --- /dev/null +++ b/plugins/parcelize/parcelize-runtime/src/kotlinx/parcelize/parcelableCreator.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("unused") +package kotlinx.parcelize + +import android.os.Parcelable + +/** + * Read the CREATOR field of the given [Parcelable] class. Calls to this function with + * a concrete class will be optimized to a direct field access. + */ +@Suppress("UNCHECKED_CAST") +inline fun parcelableCreator(): Parcelable.Creator = + T::class.java.getDeclaredField("CREATOR").get(null) as? Parcelable.Creator + ?: throw IllegalArgumentException("Could not access CREATOR field in class ${T::class.simpleName}")