[Parcelize] Fix subclass check of deprecated Parceler interface

^KT-59949 Fixed
^KT-60090 Fixed
This commit is contained in:
Brian Norman
2023-12-12 13:58:54 -06:00
committed by Space Team
parent 84388d5f04
commit 645970fa7a
2 changed files with 12 additions and 13 deletions
@@ -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.analysis.checkers.declaration.FirClassChecker
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.* 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.resolve.lookupSuperTypes
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -95,16 +96,14 @@ object FirParcelizeClassChecker : FirClassChecker() {
} }
private fun checkParcelerClass(klass: FirClass, context: CheckerContext, reporter: DiagnosticReporter) { private fun checkParcelerClass(klass: FirClass, context: CheckerContext, reporter: DiagnosticReporter) {
if (klass !is FirRegularClass || klass.isCompanion) return if (klass !is FirRegularClass || !klass.isCompanion) return
for (superTypeRef in klass.superTypeRefs) { if (klass.isSubclassOf(OLD_PARCELER_ID.toLookupTag(), context.session, isStrict = true)) {
if (superTypeRef.coneType.classId == OLD_PARCELER_ID) { val strategy = if (klass.name == SpecialNames.NO_NAME_PROVIDED) {
val strategy = if (klass.name == SpecialNames.NO_NAME_PROVIDED) { SourceElementPositioningStrategies.OBJECT_KEYWORD
SourceElementPositioningStrategies.OBJECT_KEYWORD } else {
} else { SourceElementPositioningStrategies.NAME_IDENTIFIER
SourceElementPositioningStrategies.NAME_IDENTIFIER
}
reporter.reportOn(klass.source, KtErrorsParcelize.DEPRECATED_PARCELER, context, positioningStrategy = strategy)
} }
reporter.reportOn(klass.source, KtErrorsParcelize.DEPRECATED_PARCELER, context, positioningStrategy = strategy)
} }
} }
} }
@@ -5,7 +5,7 @@ import kotlinx.android.parcel.*
import android.os.Parcel import android.os.Parcel
import android.os.Parcelable import android.os.Parcelable
object <!DEPRECATED_PARCELER!>Parceler1<!> : Parceler<String> { object Parceler1 : Parceler<String> {
override fun create(parcel: Parcel) = parcel.readInt().toString() override fun create(parcel: Parcel) = parcel.readInt().toString()
override fun String.write(parcel: Parcel, flags: Int) { override fun String.write(parcel: Parcel, flags: Int) {
@@ -13,7 +13,7 @@ object <!DEPRECATED_PARCELER!>Parceler1<!> : Parceler<String> {
} }
} }
object <!DEPRECATED_PARCELER!>Parceler2<!> : Parceler<List<String>> { object Parceler2 : Parceler<List<String>> {
override fun create(parcel: Parcel) = listOf(parcel.readString()!!) override fun create(parcel: Parcel) = listOf(parcel.readString()!!)
override fun List<String>.write(parcel: Parcel, flags: Int) { override fun List<String>.write(parcel: Parcel, flags: Int) {
@@ -32,11 +32,11 @@ data class Test(
val x by lazy { "foo" } val x by lazy { "foo" }
} }
interface <!DEPRECATED_PARCELER!>ParcelerForUser<!>: Parceler<User> interface ParcelerForUser: Parceler<User>
<!DEPRECATED_ANNOTATION!>@Parcelize<!> <!DEPRECATED_ANNOTATION!>@Parcelize<!>
class User(val name: String) : Parcelable { class User(val name: String) : Parcelable {
private companion object : ParcelerForUser { private companion <!DEPRECATED_PARCELER!>object<!> : ParcelerForUser {
override fun User.write(parcel: Parcel, flags: Int) { override fun User.write(parcel: Parcel, flags: Int) {
parcel.writeString(name) parcel.writeString(name)
} }