From 9ec469e3c3b43ff0fc6e6f8a882bf33d9ec35e6c Mon Sep 17 00:00:00 2001 From: Brian Norman Date: Thu, 4 Jan 2024 09:43:21 -0600 Subject: [PATCH] [Parcel] Expand types from TypeParceler annotation to support aliases Class properties are being expanded before checking for custom parcelers, which makes custom parcelers of type alias unable to be found. To maintain K1 behavior, the custom parceler type must also be expanded, so even the aliased type is supported when used in its raw form as a class property. ^KT-64707 Fixed --- .../FirParcelizePropertyChecker.kt | 2 +- .../diagnostics/customParcelers.fir.kt | 33 +++++++++++++++++++ .../testData/diagnostics/customParcelers.kt | 33 +++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/diagnostics/FirParcelizePropertyChecker.kt b/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/diagnostics/FirParcelizePropertyChecker.kt index 53e5303d335..290a9030b60 100644 --- a/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/diagnostics/FirParcelizePropertyChecker.kt +++ b/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/diagnostics/FirParcelizePropertyChecker.kt @@ -80,7 +80,7 @@ object FirParcelizePropertyChecker : FirPropertyChecker() { private fun getCustomParcelerTypes(annotations: List, session: FirSession): Set = annotations.mapNotNullTo(mutableSetOf()) { annotation -> if (annotation.fqName(session) in ParcelizeNames.TYPE_PARCELER_FQ_NAMES && annotation.typeArguments.size == 2) { - annotation.typeArguments[0].toConeTypeProjection().type + annotation.typeArguments[0].toConeTypeProjection().type?.fullyExpandedType(session) } else { null } diff --git a/plugins/parcelize/parcelize-compiler/testData/diagnostics/customParcelers.fir.kt b/plugins/parcelize/parcelize-compiler/testData/diagnostics/customParcelers.fir.kt index bca096f35d5..b1a7f813540 100644 --- a/plugins/parcelize/parcelize-compiler/testData/diagnostics/customParcelers.fir.kt +++ b/plugins/parcelize/parcelize-compiler/testData/diagnostics/customParcelers.fir.kt @@ -4,6 +4,10 @@ package test import kotlinx.parcelize.* import android.os.* +class Data +typealias StringData = Data +typealias NullableStringData = Data? + object StringParceler : Parceler { override fun create(parcel: Parcel) = TODO() override fun String.write(parcel: Parcel, flags: Int) = TODO() @@ -19,6 +23,16 @@ class StringClassParceler : Parceler { override fun String.write(parcel: Parcel, flags: Int) = TODO() } +class StringDataParceler : Parceler { + override fun create(parcel: Parcel) = TODO() + override fun StringData.write(parcel: Parcel, flags: Int) = TODO() +} + +class NullableStringDataParceler : Parceler { + override fun create(parcel: Parcel) = TODO() + override fun NullableStringData.write(parcel: Parcel, flags: Int) = TODO() +} + @TypeParceler class MissingParcelizeAnnotation(val a: @WriteWith String) @@ -43,3 +57,22 @@ class Test2(@TypeParceler @TypeParceler<String, StringParceler> @TypeParceler<String, CharSequenceParceler> class Test3(val a: String) : Parcelable + +@Parcelize +@TypeParceler +class StringDataParcelerTest( + val a: StringData, + val b: StringData?, + val c: Data, + val d: Data?, +) : Parcelable + +@Parcelize +@TypeParceler +class NullableStringDataParcelerTest( + val a: NullableStringData, + val b: StringData, + val c: StringData?, + val d: Data, + val e: Data?, +) : Parcelable diff --git a/plugins/parcelize/parcelize-compiler/testData/diagnostics/customParcelers.kt b/plugins/parcelize/parcelize-compiler/testData/diagnostics/customParcelers.kt index e55bde21969..1ec1a2ce8d7 100644 --- a/plugins/parcelize/parcelize-compiler/testData/diagnostics/customParcelers.kt +++ b/plugins/parcelize/parcelize-compiler/testData/diagnostics/customParcelers.kt @@ -4,6 +4,10 @@ package test import kotlinx.parcelize.* import android.os.* +class Data +typealias StringData = Data +typealias NullableStringData = Data? + object StringParceler : Parceler { override fun create(parcel: Parcel) = TODO() override fun String.write(parcel: Parcel, flags: Int) = TODO() @@ -19,6 +23,16 @@ class StringClassParceler : Parceler { override fun String.write(parcel: Parcel, flags: Int) = TODO() } +class StringDataParceler : Parceler { + override fun create(parcel: Parcel) = TODO() + override fun StringData.write(parcel: Parcel, flags: Int) = TODO() +} + +class NullableStringDataParceler : Parceler { + override fun create(parcel: Parcel) = TODO() + override fun NullableStringData.write(parcel: Parcel, flags: Int) = TODO() +} + @TypeParceler class MissingParcelizeAnnotation(val a: @WriteWith String) @@ -43,3 +57,22 @@ class Test2(@TypeParceler @TypeParceler<String, StringParceler> @TypeParceler<String, CharSequenceParceler> class Test3(val a: String) : Parcelable + +@Parcelize +@TypeParceler +class StringDataParcelerTest( + val a: StringData, + val b: StringData?, + val c: Data, + val d: Data?, +) : Parcelable + +@Parcelize +@TypeParceler +class NullableStringDataParcelerTest( + val a: NullableStringData, + val b: StringData, + val c: StringData?, + val d: Data, + val e: Data?, +) : Parcelable