From 88c9d7e3838ac3f232e0d8b170de42fecba4b5f7 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 26 Jun 2018 21:10:31 +0300 Subject: [PATCH] Parcelize: Recognize '@IgnoredOnParcel' with @get: use-site annotation target --- .../parcel/ParcelableDeclarationChecker.kt | 16 ++++++++++++++-- .../android/parcel/checker/properties.kt | 2 +- 2 files changed, 15 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 4104c81edc7..e17b1591335 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 @@ -18,6 +18,9 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor +import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget +import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.reportFromPlugin import org.jetbrains.kotlin.lexer.KtTokens @@ -83,9 +86,18 @@ class ParcelableDeclarationChecker : DeclarationChecker { diagnosticHolder: DiagnosticSink, bindingContext: BindingContext ) { + fun hasIgnoredOnParcel(): Boolean { + fun AnnotationDescriptor.isIgnoredOnParcel() = fqName == IGNORED_ON_PARCEL_FQNAME + + fun Annotations.hasIgnoredOnParcel() = getAllAnnotations() + .any { (it.target == null || it.target == AnnotationUseSiteTarget.PROPERTY_GETTER) && it.annotation.isIgnoredOnParcel() } + + return property.annotations.hasIgnoredOnParcel() || (property.getter?.annotations?.hasIgnoredOnParcel() ?: false) + } + if (containingClass.isParcelize - && (declaration.hasDelegate() || bindingContext[BindingContext.BACKING_FIELD_REQUIRED, property] == true) - && !property.annotations.hasAnnotation(IGNORED_ON_PARCEL_FQNAME) + && (declaration.hasDelegate() || bindingContext[BindingContext.BACKING_FIELD_REQUIRED, property] == true) + && !hasIgnoredOnParcel() ) { val reportElement = declaration.nameIdentifier ?: declaration diagnosticHolder.reportFromPlugin(ErrorsAndroid.PROPERTY_WONT_BE_SERIALIZED.on(reportElement), DefaultErrorMessagesAndroid) diff --git a/plugins/android-extensions/android-extensions-idea/testData/android/parcel/checker/properties.kt b/plugins/android-extensions/android-extensions-idea/testData/android/parcel/checker/properties.kt index 8baef1a0b26..f16a96f7667 100644 --- a/plugins/android-extensions/android-extensions-idea/testData/android/parcel/checker/properties.kt +++ b/plugins/android-extensions/android-extensions-idea/testData/android/parcel/checker/properties.kt @@ -29,7 +29,7 @@ class B(b: String = "" @get:IgnoredOnParcel - var c: String = "" + var c: String = "" @set:IgnoredOnParcel var d: String = ""