FIR Parcelize: allow anonymous local objects if they're enum entries
This commit is contained in:
+21
-20
@@ -46,35 +46,36 @@ object FirParcelizeClassChecker : FirClassChecker() {
|
|||||||
val symbol = klass.symbol
|
val symbol = klass.symbol
|
||||||
if (!symbol.isParcelize(context.session)) return
|
if (!symbol.isParcelize(context.session)) return
|
||||||
val source = klass.source ?: return
|
val source = klass.source ?: return
|
||||||
if (klass !is FirRegularClass) {
|
|
||||||
reporter.reportOn(source, KtErrorsParcelize.PARCELABLE_SHOULD_BE_CLASS, context)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
val classKind = klass.classKind
|
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)
|
reporter.reportOn(source, KtErrorsParcelize.PARCELABLE_SHOULD_BE_CLASS, context)
|
||||||
return
|
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) {
|
if (classKind == ClassKind.CLASS && klass.isAbstract) {
|
||||||
reporter.reportOn(source, KtErrorsParcelize.PARCELABLE_SHOULD_BE_INSTANTIABLE, context)
|
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)
|
val supertypes = lookupSuperTypes(klass, lookupInterfaces = true, deep = true, context.session, substituteTypes = false)
|
||||||
if (supertypes.none { it.classId == PARCELABLE_ID }) {
|
if (supertypes.none { it.classId == PARCELABLE_ID }) {
|
||||||
reporter.reportOn(source, KtErrorsParcelize.NO_PARCELABLE_SUPERTYPE, context)
|
reporter.reportOn(source, KtErrorsParcelize.NO_PARCELABLE_SUPERTYPE, context)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import android.os.Parcel
|
|||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
enum class Color : Parcelable { BLACK, WHITE }
|
enum class Color(val rgba8: Long) : Parcelable { BLACK(0x000000FFL), WHITE(0xFFFFFFFFL) }
|
||||||
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
object Obj : Parcelable
|
object Obj : Parcelable
|
||||||
@@ -34,5 +34,6 @@ fun box() = parcelTest { parcel ->
|
|||||||
println(obj2)
|
println(obj2)
|
||||||
|
|
||||||
assert(black2 == black)
|
assert(black2 == black)
|
||||||
|
assert(black2.rgba8 == 0x000000FFL)
|
||||||
assert(obj2 != null)
|
assert(obj2 != null)
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user