diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt index 55576eac91b..a5e7ee00f00 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt @@ -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, "", "()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)) diff --git a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/android/parcel/ParcelBoxTest.kt b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/android/parcel/ParcelBoxTest.kt index 718ed1c4f8d..15b52e7a468 100644 --- a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/android/parcel/ParcelBoxTest.kt +++ b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/android/parcel/ParcelBoxTest.kt @@ -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 + } + } + } } \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/simple.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/simple.kt index 505f41893c2..8bae69551a6 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/simple.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/simple.kt @@ -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 ->