Parcelize: Add an intrinsic to access Parcelable CREATOR fields
Fixes KT-19853. The CREATOR field is a static field on a Parcelable class which is not visible from Kotlin since the necessary metadata would have to be in a Companion object which may not exist. This commit adds a [parcelableCreator] function to kotlinx.parcelize, which is optimized to a direct field access whenever possible.
This commit is contained in:
committed by
Alexander Udalov
parent
897c09bf8d
commit
fc013c6b9f
@@ -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<A>()
|
||||
val deserialized = mutableListOf<A>()
|
||||
parcel.readTypedList(deserialized, creator)
|
||||
assert(deserialized.size == 2)
|
||||
assert(deserialized[0].value == 0)
|
||||
assert(deserialized[1].value == 1)
|
||||
}
|
||||
Reference in New Issue
Block a user