Parcelable: Use @IgnoredOnParcel annotation instead of Transient cause it's inapplicable on properties (KT-20298)
This commit is contained in:
+3
-2
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.android.parcel
|
package org.jetbrains.kotlin.android.parcel
|
||||||
|
|
||||||
|
import kotlinx.android.parcel.IgnoredOnParcel
|
||||||
import org.jetbrains.kotlin.android.parcel.serializers.ParcelSerializer
|
import org.jetbrains.kotlin.android.parcel.serializers.ParcelSerializer
|
||||||
import org.jetbrains.kotlin.android.parcel.serializers.isParcelable
|
import org.jetbrains.kotlin.android.parcel.serializers.isParcelable
|
||||||
import org.jetbrains.kotlin.android.synthetic.diagnostic.DefaultErrorMessagesAndroid
|
import org.jetbrains.kotlin.android.synthetic.diagnostic.DefaultErrorMessagesAndroid
|
||||||
@@ -46,7 +47,7 @@ val ANDROID_PARCEL_CLASS_FQNAME = FqName("android.os.Parcel")
|
|||||||
|
|
||||||
class ParcelableDeclarationChecker : SimpleDeclarationChecker {
|
class ParcelableDeclarationChecker : SimpleDeclarationChecker {
|
||||||
private companion object {
|
private companion object {
|
||||||
private val TRANSIENT_FQNAME = FqName(Transient::class.java.canonicalName)
|
private val IGNORED_ON_PARCEL_FQNAME = FqName(IgnoredOnParcel::class.java.canonicalName)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun check(
|
override fun check(
|
||||||
@@ -97,7 +98,7 @@ class ParcelableDeclarationChecker : SimpleDeclarationChecker {
|
|||||||
) {
|
) {
|
||||||
if (containingClass.isParcelize
|
if (containingClass.isParcelize
|
||||||
&& (declaration.hasDelegate() || bindingContext[BindingContext.BACKING_FIELD_REQUIRED, property] == true)
|
&& (declaration.hasDelegate() || bindingContext[BindingContext.BACKING_FIELD_REQUIRED, property] == true)
|
||||||
&& !property.annotations.hasAnnotation(TRANSIENT_FQNAME)
|
&& !property.annotations.hasAnnotation(IGNORED_ON_PARCEL_FQNAME)
|
||||||
) {
|
) {
|
||||||
val reportElement = declaration.nameIdentifier ?: declaration
|
val reportElement = declaration.nameIdentifier ?: declaration
|
||||||
diagnosticHolder.reportFromPlugin(ErrorsAndroid.PROPERTY_WONT_BE_SERIALIZED.on(reportElement), DefaultErrorMessagesAndroid)
|
diagnosticHolder.reportFromPlugin(ErrorsAndroid.PROPERTY_WONT_BE_SERIALIZED.on(reportElement), DefaultErrorMessagesAndroid)
|
||||||
|
|||||||
+1
-1
@@ -72,7 +72,7 @@ object DefaultErrorMessagesAndroid : DefaultErrorMessages.Extension {
|
|||||||
"'Parcelable' constructor parameter should be 'val' or 'var'")
|
"'Parcelable' constructor parameter should be 'val' or 'var'")
|
||||||
|
|
||||||
MAP.put(ErrorsAndroid.PROPERTY_WONT_BE_SERIALIZED,
|
MAP.put(ErrorsAndroid.PROPERTY_WONT_BE_SERIALIZED,
|
||||||
"Property would not be serialized into a 'Parcel'. Add '@Transient' annotation to remove the warning")
|
"Property would not be serialized into a 'Parcel'. Add '@IgnoredOnParcel' annotation to remove the warning")
|
||||||
|
|
||||||
MAP.put(ErrorsAndroid.OVERRIDING_WRITE_TO_PARCEL_IS_NOT_ALLOWED,
|
MAP.put(ErrorsAndroid.OVERRIDING_WRITE_TO_PARCEL_IS_NOT_ALLOWED,
|
||||||
"Overriding 'writeToParcel' is not allowed. Use 'Parceler' companion object instead")
|
"Overriding 'writeToParcel' is not allowed. Use 'Parceler' companion object instead")
|
||||||
|
|||||||
+5
-4
@@ -16,14 +16,15 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.android.parcel.quickfixes
|
package org.jetbrains.kotlin.android.parcel.quickfixes
|
||||||
|
|
||||||
|
import kotlinx.android.parcel.IgnoredOnParcel
|
||||||
import org.jetbrains.kotlin.psi.KtProperty
|
import org.jetbrains.kotlin.psi.KtProperty
|
||||||
import org.jetbrains.kotlin.psi.KtPsiFactory
|
import org.jetbrains.kotlin.psi.KtPsiFactory
|
||||||
|
|
||||||
class ParcelableAddTransientAnnotationQuickfix(property: KtProperty) : AbstractParcelableQuickFix<KtProperty>(property) {
|
class ParcelableAddIgnoreOnParcelAnnotationQuickfix(property: KtProperty) : AbstractParcelableQuickFix<KtProperty>(property) {
|
||||||
object Factory : AbstractFactory({ findElement<KtProperty>()?.let(::ParcelableAddTransientAnnotationQuickfix) })
|
object Factory : AbstractFactory({ findElement<KtProperty>()?.let(::ParcelableAddIgnoreOnParcelAnnotationQuickfix) })
|
||||||
override fun getText() = "Add ''@Transient'' annotation"
|
override fun getText() = "Add ''@IgnoredOnParcel'' annotation"
|
||||||
|
|
||||||
override fun invoke(ktPsiFactory: KtPsiFactory, element: KtProperty) {
|
override fun invoke(ktPsiFactory: KtPsiFactory, element: KtProperty) {
|
||||||
element.addAnnotationEntry(ktPsiFactory.createAnnotationEntry("@" + Transient::class.java.name)).shortenReferences()
|
element.addAnnotationEntry(ktPsiFactory.createAnnotationEntry("@" + IgnoredOnParcel::class.java.name)).shortenReferences()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -29,7 +29,7 @@ class ParcelableQuickFixContributor : QuickFixContributor {
|
|||||||
|
|
||||||
quickFixes.register(ErrorsAndroid.NO_PARCELABLE_SUPERTYPE, ParcelableAddSupertypeQuickfix.Factory)
|
quickFixes.register(ErrorsAndroid.NO_PARCELABLE_SUPERTYPE, ParcelableAddSupertypeQuickfix.Factory)
|
||||||
quickFixes.register(ErrorsAndroid.PARCELABLE_SHOULD_HAVE_PRIMARY_CONSTRUCTOR, ParcelableAddPrimaryConstructorQuickfix.Factory)
|
quickFixes.register(ErrorsAndroid.PARCELABLE_SHOULD_HAVE_PRIMARY_CONSTRUCTOR, ParcelableAddPrimaryConstructorQuickfix.Factory)
|
||||||
quickFixes.register(ErrorsAndroid.PROPERTY_WONT_BE_SERIALIZED, ParcelableAddTransientAnnotationQuickfix.Factory)
|
quickFixes.register(ErrorsAndroid.PROPERTY_WONT_BE_SERIALIZED, ParcelableAddIgnoreOnParcelAnnotationQuickfix.Factory)
|
||||||
|
|
||||||
quickFixes.register(ErrorsAndroid.OVERRIDING_WRITE_TO_PARCEL_IS_NOT_ALLOWED, ParcelMigrateToParcelizeQuickFix.FactoryForWrite)
|
quickFixes.register(ErrorsAndroid.OVERRIDING_WRITE_TO_PARCEL_IS_NOT_ALLOWED, ParcelMigrateToParcelizeQuickFix.FactoryForWrite)
|
||||||
quickFixes.register(ErrorsAndroid.OVERRIDING_WRITE_TO_PARCEL_IS_NOT_ALLOWED, ParcelRemoveCustomWriteToParcel.Factory)
|
quickFixes.register(ErrorsAndroid.OVERRIDING_WRITE_TO_PARCEL_IS_NOT_ALLOWED, ParcelRemoveCustomWriteToParcel.Factory)
|
||||||
|
|||||||
Vendored
+3
-3
@@ -5,11 +5,11 @@ import android.os.Parcelable
|
|||||||
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
class A(val firstName: String) : Parcelable {
|
class A(val firstName: String) : Parcelable {
|
||||||
val <warning descr="[PROPERTY_WONT_BE_SERIALIZED] Property would not be serialized into a 'Parcel'. Add '@Transient' annotation to remove the warning">secondName</warning>: String = ""
|
val <warning descr="[PROPERTY_WONT_BE_SERIALIZED] Property would not be serialized into a 'Parcel'. Add '@IgnoredOnParcel' annotation to remove the warning">secondName</warning>: String = ""
|
||||||
|
|
||||||
val <warning descr="[PROPERTY_WONT_BE_SERIALIZED] Property would not be serialized into a 'Parcel'. Add '@Transient' annotation to remove the warning">delegated</warning> by lazy { "" }
|
val <warning descr="[PROPERTY_WONT_BE_SERIALIZED] Property would not be serialized into a 'Parcel'. Add '@IgnoredOnParcel' annotation to remove the warning">delegated</warning> by lazy { "" }
|
||||||
|
|
||||||
lateinit var <warning descr="[PROPERTY_WONT_BE_SERIALIZED] Property would not be serialized into a 'Parcel'. Add '@Transient' annotation to remove the warning">lateinit</warning>: String
|
lateinit var <warning descr="[PROPERTY_WONT_BE_SERIALIZED] Property would not be serialized into a 'Parcel'. Add '@IgnoredOnParcel' annotation to remove the warning">lateinit</warning>: String
|
||||||
|
|
||||||
val customGetter: String
|
val customGetter: String
|
||||||
get() = ""
|
get() = ""
|
||||||
|
|||||||
+3
-4
@@ -1,5 +1,5 @@
|
|||||||
// "Annotate with ''@Parcelize''" "true"
|
// "Annotate containing class with ''@Parcelize''" "true"
|
||||||
// ERROR: Class 'Foo' should be annotated with ''@Parcelize''
|
// ERROR: Class 'Foo' should be annotated with '@Parcelize'
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|
||||||
package com.myapp.activity
|
package com.myapp.activity
|
||||||
@@ -13,5 +13,4 @@ object StringParceler : Parceler<String> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
@TypeParceler<String, StringParceler>
|
class Foo(@<caret>TypeParceler<String, StringParceler> val a: String)
|
||||||
class Foo(<caret>val a: String) : Parcelable
|
|
||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
// "Annotate containing class with ''@Parcelize''" "true"
|
// "Annotate containing class with ''@Parcelize''" "true"
|
||||||
// ERROR: Class 'Foo' should be annotated with ''@Parcelize''
|
// ERROR: Class 'Foo' should be annotated with '@Parcelize'
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|
||||||
package com.myapp.activity
|
package com.myapp.activity
|
||||||
|
|||||||
+3
-2
@@ -1,13 +1,14 @@
|
|||||||
// "Add ''@Transient'' annotation" "true"
|
// "Add ''@IgnoredOnParcel'' annotation" "true"
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|
||||||
package com.myapp.activity
|
package com.myapp.activity
|
||||||
|
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
|
import kotlinx.android.parcel.IgnoredOnParcel
|
||||||
import kotlinx.android.parcel.Parcelize
|
import kotlinx.android.parcel.Parcelize
|
||||||
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
class Test : Parcelable {
|
class Test : Parcelable {
|
||||||
@Transient
|
@IgnoredOnParcel
|
||||||
val <caret>a = 5
|
val <caret>a = 5
|
||||||
}
|
}
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// "Add ''@Transient'' annotation" "true"
|
// "Add ''@IgnoredOnParcel'' annotation" "true"
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|
||||||
package com.myapp.activity
|
package com.myapp.activity
|
||||||
|
|||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kotlinx.android.parcel
|
||||||
|
|
||||||
|
@Target(AnnotationTarget.PROPERTY)
|
||||||
|
@Retention(AnnotationRetention.SOURCE)
|
||||||
|
annotation class IgnoredOnParcel
|
||||||
Reference in New Issue
Block a user