From b595328192a3e9a378d7cdc982f70c62534bdd01 Mon Sep 17 00:00:00 2001 From: Brian Norman Date: Tue, 6 Jun 2023 13:33:42 -0500 Subject: [PATCH] [Parcelize] Ignore all sealed classes in Parcelize FIR generator Sealed classes are inherently abstract and should not have Parcelable functions added via the FIR declaration generator. #KT-59112 Fixed --- .../parcelize/fir/FirParcelizeDeclarationGenerator.kt | 8 +++----- .../parcelize-compiler/testData/box/sealedClass2.kt | 1 + .../testData/diagnostics/modality.fir.kt | 3 +++ .../parcelize-compiler/testData/diagnostics/modality.kt | 3 +++ 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/FirParcelizeDeclarationGenerator.kt b/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/FirParcelizeDeclarationGenerator.kt index 15f39fa7c7e..f27a59b2bae 100644 --- a/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/FirParcelizeDeclarationGenerator.kt +++ b/plugins/parcelize/parcelize-compiler/parcelize.k2/src/org/jetbrains/kotlin/parcelize/fir/FirParcelizeDeclarationGenerator.kt @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.fir.plugin.createConeType import org.jetbrains.kotlin.fir.plugin.createMemberFunction import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes -import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.CallableId @@ -104,15 +103,14 @@ class FirParcelizeDeclarationGenerator(session: FirSession) : FirDeclarationGene } } - @OptIn(SymbolInternals::class) override fun getCallableNamesForClass(classSymbol: FirClassSymbol<*>, context: MemberGenerationContext): Set { return when { - classSymbol.fir.modality == Modality.ABSTRACT -> emptySet() - classSymbol in matchedClasses && classSymbol.fir.modality != Modality.SEALED -> parcelizeMethodsNames + classSymbol.rawStatus.modality == Modality.ABSTRACT || classSymbol.rawStatus.modality == Modality.SEALED -> emptySet() + classSymbol in matchedClasses && classSymbol.rawStatus.modality != Modality.SEALED -> parcelizeMethodsNames else -> { val hasAnnotatedSealedSuperType = classSymbol.resolvedSuperTypeRefs.any { val superSymbol = it.type.fullyExpandedType(session).toRegularClassSymbol(session) ?: return@any false - superSymbol.fir.modality == Modality.SEALED && superSymbol in matchedClasses + superSymbol.rawStatus.modality == Modality.SEALED && superSymbol in matchedClasses } if (hasAnnotatedSealedSuperType) { parcelizeMethodsNames diff --git a/plugins/parcelize/parcelize-compiler/testData/box/sealedClass2.kt b/plugins/parcelize/parcelize-compiler/testData/box/sealedClass2.kt index 5fdb9638bb1..376609756d6 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/sealedClass2.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/sealedClass2.kt @@ -11,6 +11,7 @@ import android.os.Parcelable sealed class Foo : Parcelable { data class A(val x: Int) : Foo() object B : Foo() + sealed class Inner : Foo() } data class C(val x: String) : Foo() diff --git a/plugins/parcelize/parcelize-compiler/testData/diagnostics/modality.fir.kt b/plugins/parcelize/parcelize-compiler/testData/diagnostics/modality.fir.kt index 2d8e453a6f2..816c7f96d06 100644 --- a/plugins/parcelize/parcelize-compiler/testData/diagnostics/modality.fir.kt +++ b/plugins/parcelize/parcelize-compiler/testData/diagnostics/modality.fir.kt @@ -15,6 +15,9 @@ class Final(val foo: String) : Parcelable @Parcelize sealed class Sealed(val foo: String) : Parcelable { class X : Sealed("") + sealed class Inner : Sealed("") { + class Y : Inner() + } } class Outer { diff --git a/plugins/parcelize/parcelize-compiler/testData/diagnostics/modality.kt b/plugins/parcelize/parcelize-compiler/testData/diagnostics/modality.kt index 38441e5314e..479b51a91fa 100644 --- a/plugins/parcelize/parcelize-compiler/testData/diagnostics/modality.kt +++ b/plugins/parcelize/parcelize-compiler/testData/diagnostics/modality.kt @@ -15,6 +15,9 @@ class Final(val foo: String) : Parcelable @Parcelize sealed class Sealed(val foo: String) : Parcelable { class X : Sealed("") + sealed class Inner : Sealed("") { + class Y : Inner() + } } class Outer {