From 72e671c8f11c7d34604b6c1bdf17c3d82053a9f9 Mon Sep 17 00:00:00 2001 From: pyos Date: Thu, 15 Sep 2022 11:47:03 +0200 Subject: [PATCH] FIR Parcelize: allow anonymous local objects if they're enum entries --- .../diagnostics/FirParcelizeClassChecker.kt | 41 ++++++++++--------- .../testData/box/enumObject.kt | 3 +- 2 files changed, 23 insertions(+), 21 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 1d85d1d3151..88ea43f906b 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 @@ -46,35 +46,36 @@ object FirParcelizeClassChecker : FirClassChecker() { val symbol = klass.symbol if (!symbol.isParcelize(context.session)) return val source = klass.source ?: return - if (klass !is FirRegularClass) { - reporter.reportOn(source, KtErrorsParcelize.PARCELABLE_SHOULD_BE_CLASS, context) - return - } - val classKind = klass.classKind - if (classKind == ClassKind.ANNOTATION_CLASS || classKind == ClassKind.INTERFACE && !klass.isSealed) { + + if (klass is FirRegularClass) { + if (classKind == ClassKind.ANNOTATION_CLASS || classKind == ClassKind.INTERFACE && !klass.isSealed) { + reporter.reportOn(source, KtErrorsParcelize.PARCELABLE_SHOULD_BE_CLASS, context) + return + } + + klass.companionObjectSymbol?.let { companionSymbol -> + if (companionSymbol.classId.shortClassName == CREATOR_NAME) { + reporter.reportOn(companionSymbol.source, KtErrorsParcelize.CREATOR_DEFINITION_IS_NOT_ALLOWED, context) + } + } + + if (klass.isInner) { + reporter.reportOn(source, KtErrorsParcelize.PARCELABLE_CANT_BE_INNER_CLASS, context) + } + + if (klass.isLocal) { + reporter.reportOn(source, KtErrorsParcelize.PARCELABLE_CANT_BE_LOCAL_CLASS, context) + } + } else if (classKind != ClassKind.ENUM_ENTRY) { reporter.reportOn(source, KtErrorsParcelize.PARCELABLE_SHOULD_BE_CLASS, context) return } - klass.companionObjectSymbol?.let { companionSymbol -> - if (companionSymbol.classId.shortClassName == CREATOR_NAME) { - reporter.reportOn(companionSymbol.source, KtErrorsParcelize.CREATOR_DEFINITION_IS_NOT_ALLOWED, context) - } - } - if (classKind == ClassKind.CLASS && klass.isAbstract) { reporter.reportOn(source, KtErrorsParcelize.PARCELABLE_SHOULD_BE_INSTANTIABLE, context) } - if (klass.isInner) { - reporter.reportOn(source, KtErrorsParcelize.PARCELABLE_CANT_BE_INNER_CLASS, context) - } - - if (klass.isLocal) { - reporter.reportOn(source, KtErrorsParcelize.PARCELABLE_CANT_BE_LOCAL_CLASS, context) - } - val supertypes = lookupSuperTypes(klass, lookupInterfaces = true, deep = true, context.session, substituteTypes = false) if (supertypes.none { it.classId == PARCELABLE_ID }) { reporter.reportOn(source, KtErrorsParcelize.NO_PARCELABLE_SUPERTYPE, context) diff --git a/plugins/parcelize/parcelize-compiler/testData/box/enumObject.kt b/plugins/parcelize/parcelize-compiler/testData/box/enumObject.kt index f688a2d29e1..54693f8830b 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/enumObject.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/enumObject.kt @@ -8,7 +8,7 @@ import android.os.Parcel import android.os.Parcelable @Parcelize -enum class Color : Parcelable { BLACK, WHITE } +enum class Color(val rgba8: Long) : Parcelable { BLACK(0x000000FFL), WHITE(0xFFFFFFFFL) } @Parcelize object Obj : Parcelable @@ -34,5 +34,6 @@ fun box() = parcelTest { parcel -> println(obj2) assert(black2 == black) + assert(black2.rgba8 == 0x000000FFL) assert(obj2 != null) } \ No newline at end of file