diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt index ea57f969d69..793161db934 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.android.parcel -import kotlinx.android.parcel.Parceler import org.jetbrains.kotlin.android.parcel.ParcelableSyntheticComponent.ComponentKind.* import org.jetbrains.kotlin.android.parcel.ParcelableResolveExtension.Companion.createMethod import org.jetbrains.kotlin.android.parcel.serializers.PARCEL_TYPE @@ -55,9 +54,6 @@ import java.io.FileDescriptor open class ParcelableCodegenExtension : ExpressionCodegenExtension { private companion object { private val FILE_DESCRIPTOR_FQNAME = FqName(FileDescriptor::class.java.canonicalName) - private val PARCELER_FQNAME = FqName(Parceler::class.java.canonicalName) - - fun KotlinType.isParceler() = constructor.declarationDescriptor?.fqNameSafe == PARCELER_FQNAME } protected open fun isExperimental(element: KtElement) = true @@ -77,7 +73,7 @@ open class ParcelableCodegenExtension : ExpressionCodegenExtension { val parcelAsmType = codegen.typeMapper.mapType(parcelClassType) val parcelerObject = parcelableClass.companionObjectDescriptor?.takeIf { - TypeUtils.getAllSupertypes(it.defaultType).any { it.isParceler() } + TypeUtils.getAllSupertypes(it.defaultType).any { it.isParceler } } with (parcelableClass) { @@ -297,7 +293,7 @@ open class ParcelableCodegenExtension : ExpressionCodegenExtension { it.typeParameters.isEmpty() && it.kind == CallableMemberDescriptor.Kind.DECLARATION && (it.valueParameters.size == 1 && KotlinBuiltIns.isInt(it.valueParameters[0].type)) - && !((it.containingDeclaration as? ClassDescriptor)?.defaultType?.isParceler() ?: true) + && !((it.containingDeclaration as? ClassDescriptor)?.defaultType?.isParceler ?: true) } if (newArrayMethod != null) { @@ -321,7 +317,7 @@ open class ParcelableCodegenExtension : ExpressionCodegenExtension { private fun FunctionDescriptor.write(codegen: ImplementationBodyCodegen, code: ExpressionCodegen.() -> Unit) { codegen.functionCodegen.generateMethod(JvmDeclarationOrigin.NO_ORIGIN, this, object : CodegenBased(codegen.state) { - override fun doGenerateBody(e: ExpressionCodegen, signature: JvmMethodSignature) { + override fun doGenerateBody(e: ExpressionCodegen, signature: JvmMethodSignature) = with(e) { e.code() } }) 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 25c9f1a21bf..a4c35664311 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 @@ -202,7 +202,7 @@ class ParcelableDeclarationChecker : SimpleDeclarationChecker { val descriptor = typeMapper.bindingContext[BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, parameter] ?: return val type = descriptor.type - if (!type.isError) { + if (!type.isError && !containerClass.hasCustomParceler()) { val asmType = typeMapper.mapType(type) try { @@ -216,4 +216,9 @@ class ParcelableDeclarationChecker : SimpleDeclarationChecker { } } } + + private fun ClassDescriptor.hasCustomParceler(): Boolean { + val companionObjectSuperTypes = companionObjectDescriptor?.let { TypeUtils.getAllSupertypes(it.defaultType) } ?: return false + return companionObjectSuperTypes.any { it.isParceler } + } } \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableResolveExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableResolveExtension.kt index dd95f3f36b3..1cbd3b1605c 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableResolveExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableResolveExtension.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.android.parcel +import kotlinx.android.parcel.Parceler import kotlinx.android.parcel.Parcelize import org.jetbrains.kotlin.android.parcel.ParcelableSyntheticComponent.ComponentKind.* import org.jetbrains.kotlin.builtins.KotlinBuiltIns @@ -136,7 +137,11 @@ interface ParcelableSyntheticComponent { } } -private val PARCELIZE_CLASS_FQNAME = FqName(Parcelize::class.java.canonicalName) +val PARCELIZE_CLASS_FQNAME: FqName = FqName(Parcelize::class.java.canonicalName) +internal val PARCELER_FQNAME: FqName = FqName(Parceler::class.java.canonicalName) -internal val ClassDescriptor.isParcelize: Boolean - get() = this.annotations.hasAnnotation(PARCELIZE_CLASS_FQNAME) \ No newline at end of file +val ClassDescriptor.isParcelize: Boolean + get() = this.annotations.hasAnnotation(PARCELIZE_CLASS_FQNAME) + +val KotlinType.isParceler + get() = constructor.declarationDescriptor?.fqNameSafe == PARCELER_FQNAME \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/IBinderIInterface.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/IBinderIInterface.kt index d204a33033e..632bfd84dc2 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/IBinderIInterface.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/IBinderIInterface.kt @@ -1,4 +1,5 @@ // CURIOUS_ABOUT writeToParcel, createFromParcel +// WITH_RUNTIME import kotlinx.android.parcel.* import android.os.Parcelable diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.kt index 01759ef4fd0..dc0f2252c72 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.kt @@ -1,4 +1,5 @@ // CURIOUS_ABOUT describeContents +// WITH_RUNTIME import kotlinx.android.parcel.* import android.os.Parcelable diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.kt index 01de5a89e37..e7d594d59a0 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.kt @@ -1,4 +1,5 @@ // CURIOUS_ABOUT writeToParcel, createFromParcel, newArray +// WITH_RUNTIME import kotlinx.android.parcel.* import android.os.Parcel diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.kt index 00b5fe986d6..39c6d53f30d 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.kt @@ -1,4 +1,5 @@ // CURIOUS_ABOUT newArray +// WITH_RUNTIME import kotlinx.android.parcel.* import android.os.Parcel diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.kt index 18ce4f22b6d..247e0e45fad 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.kt @@ -1,4 +1,5 @@ // CURIOUS_ABOUT describeContents +// WITH_RUNTIME import kotlinx.android.parcel.* import android.os.Parcelable diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.kt index f1f5d2686fc..22a7384faae 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.kt @@ -1,4 +1,5 @@ // CURIOUS_ABOUT writeToParcel +// WITH_RUNTIME import kotlinx.android.parcel.* diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/nullableNotNullSize.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/nullableNotNullSize.kt index 2b9e36b6c57..4b02fc3be6d 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/nullableNotNullSize.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/nullableNotNullSize.kt @@ -1,4 +1,5 @@ // CURIOUS_ABOUT writeToParcel +// WITH_RUNTIME import android.util.Size import kotlinx.android.parcel.* diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.kt index 37f7829539a..c558e98ae21 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.kt @@ -1,4 +1,5 @@ // CURIOUS_ABOUT writeToParcel, createFromParcel, +// WITH_RUNTIME package test diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializable.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializable.kt index 35942bfd67c..a3117b22cf9 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializable.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializable.kt @@ -1,4 +1,5 @@ // CURIOUS_ABOUT writeToParcel, createFromParcel, +// WITH_RUNTIME import kotlinx.android.parcel.* import android.os.Parcelable diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.kt index ab426614a1a..e71af0cd570 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.kt @@ -1,4 +1,5 @@ // CURIOUS_ABOUT writeToParcel, createFromParcel, , describeContents +// WITH_RUNTIME // LOCAL_VARIABLES_TABLE import kotlinx.android.parcel.* diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.kt index 30bb4cdea3f..e0a2080312a 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.kt @@ -1,4 +1,5 @@ // CURIOUS_ABOUT writeToParcel +// WITH_RUNTIME import kotlinx.android.parcel.* diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/size.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/size.kt index b80d0bef848..615a9d23b2a 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/size.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/size.kt @@ -1,4 +1,5 @@ // CURIOUS_ABOUT writeToParcel, createFromParcel +// WITH_RUNTIME import kotlinx.android.parcel.* import android.os.Parcelable diff --git a/plugins/android-extensions/android-extensions-idea/android-extensions-idea.iml b/plugins/android-extensions/android-extensions-idea/android-extensions-idea.iml index 244da119acc..99397c7c3c2 100644 --- a/plugins/android-extensions/android-extensions-idea/android-extensions-idea.iml +++ b/plugins/android-extensions/android-extensions-idea/android-extensions-idea.iml @@ -27,5 +27,6 @@ + \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-idea/testData/android/parcel/checker/kt20062.kt b/plugins/android-extensions/android-extensions-idea/testData/android/parcel/checker/kt20062.kt new file mode 100644 index 00000000000..c1d1db3ee97 --- /dev/null +++ b/plugins/android-extensions/android-extensions-idea/testData/android/parcel/checker/kt20062.kt @@ -0,0 +1,20 @@ +package test + +import kotlinx.android.parcel.* +import android.os.* + +class Box(val value: String) + +@Parcelize +class Foo(val box: Box): Parcelable { + companion object : Parceler { + override fun create(parcel: Parcel) = Foo(Box(parcel.readString())) + + override fun Foo.write(parcel: Parcel, flags: Int) { + parcel.writeString(box.value) + } + } +} + +@Parcelize +class Foo2(val box: Box): Parcelable \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-idea/tests/org/jetbrains/kotlin/android/ParcelCheckerTestGenerated.java b/plugins/android-extensions/android-extensions-idea/tests/org/jetbrains/kotlin/android/ParcelCheckerTestGenerated.java index 7d1ba009588..fae80edb89e 100644 --- a/plugins/android-extensions/android-extensions-idea/tests/org/jetbrains/kotlin/android/ParcelCheckerTestGenerated.java +++ b/plugins/android-extensions/android-extensions-idea/tests/org/jetbrains/kotlin/android/ParcelCheckerTestGenerated.java @@ -66,6 +66,12 @@ public class ParcelCheckerTestGenerated extends AbstractParcelCheckerTest { doTest(fileName); } + @TestMetadata("kt20062.kt") + public void testKt20062() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-idea/testData/android/parcel/checker/kt20062.kt"); + doTest(fileName); + } + @TestMetadata("modality.kt") public void testModality() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-idea/testData/android/parcel/checker/modality.kt");