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 b59b63ba1fe..e9b4135729d 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 @@ -230,7 +230,9 @@ class IrParcelSerializerFactory(symbols: AndroidSymbols) { classifier.isEnumClass -> return wrapNullableSerializerIfNeeded(irType, IrEnumParcelSerializer(classifier)) - classifier.isSubclassOfFqName("java.io.Serializable") -> + classifier.isSubclassOfFqName("java.io.Serializable") + // Functions and Continuations are always serializable. + || irType.isFunctionTypeOrSubtype() || irType.isSuspendFunctionTypeOrSubtype() -> return serializableSerializer strict() -> diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializer.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializer.kt index a16fd1dcbcc..0d197feaf7e 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializer.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializer.kt @@ -301,7 +301,7 @@ interface ParcelSerializer { private fun Type.isSparseIntArray() = this.descriptor == "Landroid/util/SparseIntArray;" private fun Type.isSparseLongArray() = this.descriptor == "Landroid/util/SparseLongArray;" private fun Type.isSparseArray() = this.descriptor == "Landroid/util/SparseArray;" - private fun KotlinType.isSerializable() = matchesFqNameWithSupertypes("java.io.Serializable") + private fun KotlinType.isSerializable() = matchesFqNameWithSupertypes("java.io.Serializable") || matchesFqNameWithSupertypes("kotlin.Function") private fun KotlinType.isException() = matchesFqNameWithSupertypes("java.lang.Exception") private fun KotlinType.isIBinder() = matchesFqNameWithSupertypes("android.os.IBinder") private fun KotlinType.isIInterface() = matchesFqNameWithSupertypes("android.os.IInterface") 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 71d0d0b5ee2..1a95f25117d 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 @@ -109,6 +109,11 @@ public class ParcelBoxTestGenerated extends AbstractParcelBoxTest { runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/box/exceptions.kt"); } + @TestMetadata("functions.kt") + public void testFunctions() throws Exception { + runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/box/functions.kt"); + } + @TestMetadata("intArray.kt") public void testIntArray() throws Exception { runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/box/intArray.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 262891aeca4..68aa9186a9a 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 @@ -109,6 +109,11 @@ public class ParcelIrBoxTestGenerated extends AbstractParcelIrBoxTest { runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/box/exceptions.kt"); } + @TestMetadata("functions.kt") + public void testFunctions() throws Exception { + runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/box/functions.kt"); + } + @TestMetadata("intArray.kt") public void testIntArray() throws Exception { runTest("plugins/android-extensions/android-extensions-compiler/testData/parcel/box/intArray.kt"); diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/functions.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/functions.kt new file mode 100644 index 00000000000..e9bc9a2a733 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/functions.kt @@ -0,0 +1,24 @@ +// WITH_RUNTIME + +@file:JvmName("TestKt") +package test + +import kotlinx.android.parcel.* +import android.os.Parcel +import android.os.Parcelable + +@Parcelize +data class Test(val callback: () -> Int = { 0 }, val suspendCallback: suspend () -> Int = { 0 }) : Parcelable + +fun box() = parcelTest { parcel -> + val test = Test({ 1 }, { 1 }) + test.writeToParcel(parcel, 0) + + val bytes = parcel.marshall() + parcel.unmarshall(bytes, 0, bytes.size) + parcel.setDataPosition(0) + + val test2 = readFromParcel(parcel) + + assert(test.callback() == 1) +}