From 26af1286943f20df3aad7c9ca728fa594126f8fb Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 8 Sep 2017 22:07:12 +0300 Subject: [PATCH] Parcelable: produce error on "CREATOR" companion object --- .../android/parcel/ParcelableDeclarationChecker.kt | 12 ++++++++++-- .../testData/android/parcel/checker/customCreator.kt | 10 +++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableDeclarationChecker.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableDeclarationChecker.kt index 6be70cb7f5c..83a2b0abd5c 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableDeclarationChecker.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableDeclarationChecker.kt @@ -40,8 +40,9 @@ import org.jetbrains.kotlin.resolve.jvm.annotations.findJvmFieldAnnotation import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.isError -private val ANDROID_PARCELABLE_CLASS_FQNAME = FqName("android.os.Parcelable") -internal val ANDROID_PARCEL_CLASS_FQNAME = FqName("android.os.Parcel") +val ANDROID_PARCELABLE_CLASS_FQNAME = FqName("android.os.Parcelable") +val ANDROID_PARCELABLE_CREATOR_CLASS_FQNAME = FqName("android.os.Parcelable.Creator") +val ANDROID_PARCEL_CLASS_FQNAME = FqName("android.os.Parcel") class ParcelableDeclarationChecker : SimpleDeclarationChecker { private companion object { @@ -132,6 +133,13 @@ class ParcelableDeclarationChecker : SimpleDeclarationChecker { return } + for (companion in declaration.companionObjects) { + if (companion.name == "CREATOR") { + val reportElement = companion.nameIdentifier ?: companion + diagnosticHolder.reportFromPlugin(ErrorsAndroid.CREATOR_DEFINITION_IS_NOT_ALLOWED.on(reportElement), DefaultErrorMessagesAndroid) + } + } + val sealedOrAbstract = declaration.modifierList?.let { it.getModifier(KtTokens.ABSTRACT_KEYWORD) ?: it.getModifier(KtTokens.SEALED_KEYWORD) } if (sealedOrAbstract != null) { diagnosticHolder.reportFromPlugin(ErrorsAndroid.PARCELABLE_SHOULD_BE_INSTANTIABLE.on(sealedOrAbstract), DefaultErrorMessagesAndroid) diff --git a/plugins/android-extensions/android-extensions-idea/testData/android/parcel/checker/customCreator.kt b/plugins/android-extensions/android-extensions-idea/testData/android/parcel/checker/customCreator.kt index a7937556d1e..ea673620b15 100644 --- a/plugins/android-extensions/android-extensions-idea/testData/android/parcel/checker/customCreator.kt +++ b/plugins/android-extensions/android-extensions-idea/testData/android/parcel/checker/customCreator.kt @@ -8,9 +8,17 @@ import android.os.Parcel class A(val a: String) : Parcelable { companion object { @JvmField - val CREATOR = object : Parcelable.Creator { + val CREATOR = object : Parcelable.Creator { override fun createFromParcel(source: Parcel): A = A("") override fun newArray(size: Int) = arrayOfNulls(size) } } +} + +@Parcelize +class B(val b: String) : Parcelable { + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(source: Parcel): B = B("") + override fun newArray(size: Int) = arrayOfNulls(size) + } } \ No newline at end of file