From 645970fa7abfbcb3d566dd2698b7a022c5e5e5a5 Mon Sep 17 00:00:00 2001 From: Brian Norman Date: Tue, 12 Dec 2023 13:58:54 -0600 Subject: [PATCH] [Parcelize] Fix subclass check of deprecated Parceler interface ^KT-59949 Fixed ^KT-60090 Fixed --- .../fir/diagnostics/FirParcelizeClassChecker.kt | 17 ++++++++--------- .../diagnostics/deprecatedAnnotations.fir.kt | 8 ++++---- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/diagnostics/FirParcelizeClassChecker.kt b/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/diagnostics/FirParcelizeClassChecker.kt index 6e01dda44a2..c1b1616bed6 100644 --- a/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/diagnostics/FirParcelizeClassChecker.kt +++ b/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/diagnostics/FirParcelizeClassChecker.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirClassChecker import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.* +import org.jetbrains.kotlin.fir.resolve.isSubclassOf import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.types.* @@ -95,16 +96,14 @@ object FirParcelizeClassChecker : FirClassChecker() { } private fun checkParcelerClass(klass: FirClass, context: CheckerContext, reporter: DiagnosticReporter) { - if (klass !is FirRegularClass || klass.isCompanion) return - for (superTypeRef in klass.superTypeRefs) { - if (superTypeRef.coneType.classId == OLD_PARCELER_ID) { - val strategy = if (klass.name == SpecialNames.NO_NAME_PROVIDED) { - SourceElementPositioningStrategies.OBJECT_KEYWORD - } else { - SourceElementPositioningStrategies.NAME_IDENTIFIER - } - reporter.reportOn(klass.source, KtErrorsParcelize.DEPRECATED_PARCELER, context, positioningStrategy = strategy) + if (klass !is FirRegularClass || !klass.isCompanion) return + if (klass.isSubclassOf(OLD_PARCELER_ID.toLookupTag(), context.session, isStrict = true)) { + val strategy = if (klass.name == SpecialNames.NO_NAME_PROVIDED) { + SourceElementPositioningStrategies.OBJECT_KEYWORD + } else { + SourceElementPositioningStrategies.NAME_IDENTIFIER } + reporter.reportOn(klass.source, KtErrorsParcelize.DEPRECATED_PARCELER, context, positioningStrategy = strategy) } } } diff --git a/plugins/parcelize/parcelize-compiler/testData/diagnostics/deprecatedAnnotations.fir.kt b/plugins/parcelize/parcelize-compiler/testData/diagnostics/deprecatedAnnotations.fir.kt index 3d7a333fdc7..e054cc8d1bb 100644 --- a/plugins/parcelize/parcelize-compiler/testData/diagnostics/deprecatedAnnotations.fir.kt +++ b/plugins/parcelize/parcelize-compiler/testData/diagnostics/deprecatedAnnotations.fir.kt @@ -5,7 +5,7 @@ import kotlinx.android.parcel.* import android.os.Parcel import android.os.Parcelable -object Parceler1 : Parceler { +object Parceler1 : Parceler { override fun create(parcel: Parcel) = parcel.readInt().toString() override fun String.write(parcel: Parcel, flags: Int) { @@ -13,7 +13,7 @@ object Parceler1 : Parceler { } } -object Parceler2 : Parceler> { +object Parceler2 : Parceler> { override fun create(parcel: Parcel) = listOf(parcel.readString()!!) override fun List.write(parcel: Parcel, flags: Int) { @@ -32,11 +32,11 @@ data class Test( val x by lazy { "foo" } } -interface ParcelerForUser: Parceler +interface ParcelerForUser: Parceler @Parcelize class User(val name: String) : Parcelable { - private companion object : ParcelerForUser { + private companion object : ParcelerForUser { override fun User.write(parcel: Parcel, flags: Int) { parcel.writeString(name) }