From 32fc340d628052869ae7a7318a6df8e99ecca1cf Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 1 Sep 2017 21:44:31 +0300 Subject: [PATCH] Parcelable: Parcelize overrides describeContents despite being already implemented (KT-20026) --- .../parcel/ParcelableResolveExtension.kt | 5 +- .../codegen/describeContentsFromSuperType.kt | 11 ++++ .../codegen/describeContentsFromSuperType.txt | 53 +++++++++++++++++++ .../ParcelBytecodeListingTestGenerated.java | 6 +++ 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.kt create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.txt 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 ad987f74b89..dd95f3f36b3 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 @@ -93,6 +93,7 @@ open class ParcelableResolveExtension : SyntheticResolveExtension { && clazz.isParcelize && isExperimental() && result.none { it.isDescribeContents() } + && fromSupertypes.none { it.isDescribeContents() } ) { result += createMethod(clazz, DESCRIBE_CONTENTS, clazz.builtIns.intType) } else if (name.asString() == WRITE_TO_PARCEL.methodName @@ -107,7 +108,9 @@ open class ParcelableResolveExtension : SyntheticResolveExtension { } private fun SimpleFunctionDescriptor.isDescribeContents(): Boolean { - return typeParameters.isEmpty() + return this.kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE + && modality != Modality.ABSTRACT + && typeParameters.isEmpty() && valueParameters.isEmpty() && returnType?.let { type -> KotlinBuiltIns.isInt(type) } == true } 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 new file mode 100644 index 00000000000..18ce4f22b6d --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.kt @@ -0,0 +1,11 @@ +// CURIOUS_ABOUT describeContents + +import kotlinx.android.parcel.* +import android.os.Parcelable + +abstract class AbstractUser : Parcelable { + override fun describeContents() = 100 +} + +@Parcelize +class User(val firstName: String, val lastName: String, val age: Int, val isProUser: Boolean) : AbstractUser() \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.txt new file mode 100644 index 00000000000..60e5809cea7 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.txt @@ -0,0 +1,53 @@ +public abstract class AbstractUser : java/lang/Object, android/os/Parcelable { + public void () + + public int describeContents() { + LABEL (L0) + LINENUMBER (7) + BIPUSH (100) + IRETURN + LABEL (L1) + } +} + +public final class User$Companion : java/lang/Object { + private void () + + public void (kotlin.jvm.internal.DefaultConstructorMarker p0) +} + +public static class User$Creator : java/lang/Object, android/os/Parcelable$Creator { + public void () + + public final java.lang.Object createFromParcel(android.os.Parcel p0) + + public final User[] newArray(int p0) +} + +public final class User : AbstractUser { + public final static User$Creator CREATOR + + public final static User$Companion Companion + + private final int age + + private final java.lang.String firstName + + private final boolean isProUser + + private final java.lang.String lastName + + static void () + + public void (java.lang.String p0, java.lang.String p1, int p2, boolean p3) + + public final int getAge() + + public final java.lang.String getFirstName() + + public final java.lang.String getLastName() + + public final boolean isProUser() + + public final void writeToParcel(android.os.Parcel p0, int p1) +} diff --git a/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/ParcelBytecodeListingTestGenerated.java b/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/ParcelBytecodeListingTestGenerated.java index a893bf06ea1..31df54a04fc 100644 --- a/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/ParcelBytecodeListingTestGenerated.java +++ b/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/ParcelBytecodeListingTestGenerated.java @@ -54,6 +54,12 @@ public class ParcelBytecodeListingTestGenerated extends AbstractParcelBytecodeLi doTest(fileName); } + @TestMetadata("describeContentsFromSuperType.kt") + public void testDescribeContentsFromSuperType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.kt"); + doTest(fileName); + } + @TestMetadata("duplicatingClinit.kt") public void testDuplicatingClinit() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/duplicatingClinit.kt");