Parcelable: Fix compatibility with serialization plugin (KT-20742)
This commit is contained in:
+4
-3
@@ -45,7 +45,7 @@ class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptor
|
|||||||
) : ClassBuilderFactory {
|
) : ClassBuilderFactory {
|
||||||
|
|
||||||
override fun newClassBuilder(origin: JvmDeclarationOrigin): ClassBuilder {
|
override fun newClassBuilder(origin: JvmDeclarationOrigin): ClassBuilder {
|
||||||
return AndroidOnDestroyCollectorClassBuilder(delegateFactory.newClassBuilder(origin), bindingContext)
|
return AndroidOnDestroyCollectorClassBuilder(origin, delegateFactory.newClassBuilder(origin), bindingContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getClassBuilderMode() = delegateFactory.classBuilderMode
|
override fun getClassBuilderMode() = delegateFactory.classBuilderMode
|
||||||
@@ -64,6 +64,7 @@ class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptor
|
|||||||
}
|
}
|
||||||
|
|
||||||
private inner class AndroidOnDestroyCollectorClassBuilder(
|
private inner class AndroidOnDestroyCollectorClassBuilder(
|
||||||
|
val declarationOrigin: JvmDeclarationOrigin,
|
||||||
internal val delegateClassBuilder: ClassBuilder,
|
internal val delegateClassBuilder: ClassBuilder,
|
||||||
val bindingContext: BindingContext
|
val bindingContext: BindingContext
|
||||||
) : DelegatingClassBuilder() {
|
) : DelegatingClassBuilder() {
|
||||||
@@ -97,7 +98,7 @@ class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptor
|
|||||||
override fun done() {
|
override fun done() {
|
||||||
if (!isClinitGenerated && currentClass != null && currentClassName != null) {
|
if (!isClinitGenerated && currentClass != null && currentClassName != null) {
|
||||||
val descriptor = bindingContext[BindingContext.CLASS, currentClass]
|
val descriptor = bindingContext[BindingContext.CLASS, currentClass]
|
||||||
if (descriptor != null && descriptor.isParcelize) {
|
if (descriptor != null && declarationOrigin.descriptor == descriptor && descriptor.isParcelize) {
|
||||||
val baseVisitor = super.newMethod(JvmDeclarationOrigin.NO_ORIGIN, ACC_STATIC, "<clinit>", "()V", null, null)
|
val baseVisitor = super.newMethod(JvmDeclarationOrigin.NO_ORIGIN, ACC_STATIC, "<clinit>", "()V", null, null)
|
||||||
val visitor = ClinitAwareMethodVisitor(currentClassName!!, baseVisitor)
|
val visitor = ClinitAwareMethodVisitor(currentClassName!!, baseVisitor)
|
||||||
|
|
||||||
@@ -122,7 +123,7 @@ class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptor
|
|||||||
isClinitGenerated = true
|
isClinitGenerated = true
|
||||||
|
|
||||||
val descriptor = bindingContext[BindingContext.CLASS, currentClass]
|
val descriptor = bindingContext[BindingContext.CLASS, currentClass]
|
||||||
if (descriptor != null && descriptor.isParcelize) {
|
if (descriptor != null && declarationOrigin.descriptor == descriptor && descriptor.isParcelize) {
|
||||||
return ClinitAwareMethodVisitor(
|
return ClinitAwareMethodVisitor(
|
||||||
currentClassName!!,
|
currentClassName!!,
|
||||||
super.newMethod(origin, access, name, desc, signature, exceptions))
|
super.newMethod(origin, access, name, desc, signature, exceptions))
|
||||||
|
|||||||
+27
@@ -16,6 +16,13 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.android.parcel
|
package org.jetbrains.kotlin.android.parcel
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension
|
||||||
|
|
||||||
class ParcelBoxTest : AbstractParcelBoxTest() {
|
class ParcelBoxTest : AbstractParcelBoxTest() {
|
||||||
fun testSimple() = doTest("simple")
|
fun testSimple() = doTest("simple")
|
||||||
fun testPrimitiveTypes() = doTest("primitiveTypes")
|
fun testPrimitiveTypes() = doTest("primitiveTypes")
|
||||||
@@ -47,3 +54,23 @@ class ParcelBoxTest : AbstractParcelBoxTest() {
|
|||||||
fun testCustomSerializerWriteWith() = doTest("customSerializerWriteWith")
|
fun testCustomSerializerWriteWith() = doTest("customSerializerWriteWith")
|
||||||
fun testCustomSerializerBoxing() = doTest("customSerializerBoxing")
|
fun testCustomSerializerBoxing() = doTest("customSerializerBoxing")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ParcelBoxTestWithSerializableLikeExtension : AbstractParcelBoxTest() {
|
||||||
|
fun testSimple() = doTest("simple")
|
||||||
|
|
||||||
|
override fun setupEnvironment(environment: KotlinCoreEnvironment) {
|
||||||
|
super.setupEnvironment(environment)
|
||||||
|
SyntheticResolveExtension.registerExtension(environment.project, SerializableLike())
|
||||||
|
}
|
||||||
|
|
||||||
|
private class SerializableLike : SyntheticResolveExtension {
|
||||||
|
override fun getSyntheticCompanionObjectNameIfNeeded(thisDescriptor: ClassDescriptor): Name? {
|
||||||
|
fun ClassDescriptor.isSerializableLike() = annotations.hasAnnotation(FqName("test.SerializableLike"))
|
||||||
|
|
||||||
|
return when {
|
||||||
|
thisDescriptor.kind == ClassKind.CLASS && thisDescriptor.isSerializableLike() -> Name.identifier("Companion")
|
||||||
|
else -> return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
-1
@@ -7,7 +7,9 @@ import kotlinx.android.parcel.*
|
|||||||
import android.os.Parcel
|
import android.os.Parcel
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
|
|
||||||
@Parcelize
|
annotation class SerializableLike
|
||||||
|
|
||||||
|
@Parcelize @SerializableLike
|
||||||
data class User(val firstName: String, val secondName: String, val age: Int) : Parcelable
|
data class User(val firstName: String, val secondName: String, val age: Int) : Parcelable
|
||||||
|
|
||||||
fun box() = parcelTest { parcel ->
|
fun box() = parcelTest { parcel ->
|
||||||
|
|||||||
Reference in New Issue
Block a user