Parcelable: Fix compatibility with serialization plugin (KT-20742)

This commit is contained in:
Yan Zhulanow
2017-10-18 17:20:32 +03:00
parent 3d155dd757
commit 26005751d8
3 changed files with 34 additions and 4 deletions
@@ -45,7 +45,7 @@ class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptor
) : ClassBuilderFactory {
override fun newClassBuilder(origin: JvmDeclarationOrigin): ClassBuilder {
return AndroidOnDestroyCollectorClassBuilder(delegateFactory.newClassBuilder(origin), bindingContext)
return AndroidOnDestroyCollectorClassBuilder(origin, delegateFactory.newClassBuilder(origin), bindingContext)
}
override fun getClassBuilderMode() = delegateFactory.classBuilderMode
@@ -64,6 +64,7 @@ class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptor
}
private inner class AndroidOnDestroyCollectorClassBuilder(
val declarationOrigin: JvmDeclarationOrigin,
internal val delegateClassBuilder: ClassBuilder,
val bindingContext: BindingContext
) : DelegatingClassBuilder() {
@@ -97,7 +98,7 @@ class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptor
override fun done() {
if (!isClinitGenerated && currentClass != null && currentClassName != null) {
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 visitor = ClinitAwareMethodVisitor(currentClassName!!, baseVisitor)
@@ -122,7 +123,7 @@ class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptor
isClinitGenerated = true
val descriptor = bindingContext[BindingContext.CLASS, currentClass]
if (descriptor != null && descriptor.isParcelize) {
if (descriptor != null && declarationOrigin.descriptor == descriptor && descriptor.isParcelize) {
return ClinitAwareMethodVisitor(
currentClassName!!,
super.newMethod(origin, access, name, desc, signature, exceptions))
@@ -16,6 +16,13 @@
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() {
fun testSimple() = doTest("simple")
fun testPrimitiveTypes() = doTest("primitiveTypes")
@@ -46,4 +53,24 @@ class ParcelBoxTest : AbstractParcelBoxTest() {
fun testCustomSerializerSimple() = doTest("customSerializerSimple")
fun testCustomSerializerWriteWith() = doTest("customSerializerWriteWith")
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
}
}
}
}
@@ -7,7 +7,9 @@ import kotlinx.android.parcel.*
import android.os.Parcel
import android.os.Parcelable
@Parcelize
annotation class SerializableLike
@Parcelize @SerializableLike
data class User(val firstName: String, val secondName: String, val age: Int) : Parcelable
fun box() = parcelTest { parcel ->