FIR Parcelize: allow anonymous local objects if they're enum entries

This commit is contained in:
pyos
2022-09-15 11:47:03 +02:00
committed by Dmitriy Novozhilov
parent 1f1fef1067
commit 72e671c8f1
2 changed files with 23 additions and 21 deletions
@@ -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)
@@ -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)
}