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 4bdef4aa42e..e5f9dea17dd 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 @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.android.parcel import kotlinx.android.parcel.MagicParcel import org.jetbrains.kotlin.android.parcel.ParcelableSyntheticComponent.ComponentKind.* +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl @@ -78,7 +79,7 @@ class ParcelableResolveExtension : SyntheticResolveExtension { fromSupertypes: List, result: MutableCollection ) { - if (name.asString() == DESCRIBE_CONTENTS.methodName && clazz.isMagicParcelable) { + if (name.asString() == DESCRIBE_CONTENTS.methodName && clazz.isMagicParcelable && result.none { it.isDescribeContents() }) { result += createMethod(clazz, DESCRIBE_CONTENTS, clazz.builtIns.intType) } else if (name.asString() == WRITE_TO_PARCEL.methodName && clazz.isMagicParcelable) { val builtIns = clazz.builtIns @@ -86,6 +87,10 @@ class ParcelableResolveExtension : SyntheticResolveExtension { result += createMethod(clazz, WRITE_TO_PARCEL, builtIns.unitType, "parcel" to parcelClassType, "flags" to builtIns.intType) } } + + private fun SimpleFunctionDescriptor.isDescribeContents(): Boolean { + return typeParameters.isEmpty() && valueParameters.isEmpty() && returnType?.let { type -> KotlinBuiltIns.isInt(type) } == true + } } interface ParcelableSyntheticComponent { 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 new file mode 100644 index 00000000000..8be71dbffad --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.kt @@ -0,0 +1,9 @@ +// CURIOUS_ABOUT describeContents + +import kotlinx.android.parcel.* +import android.os.Parcelable + +@MagicParcel +class User(val firstName: String, val lastName: String, val age: Int, val isProUser: Boolean) : Parcelable { + override fun describeContents() = 100 +} \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.txt new file mode 100644 index 00000000000..1342fcea441 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.txt @@ -0,0 +1,41 @@ +public static class User$CREATOR : java/lang/Object, android/os/Parcelable$Creator { + public void () + + public final User createFromParcel(android.os.Parcel p0) + + public final User[] newArray(int p0) +} + +public final class User : java/lang/Object, android/os/Parcelable { + public final static User$CREATOR CREATOR + + 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 int describeContents() { + LABEL (L0) + LINENUMBER (8) + BIPUSH (100) + IRETURN + LABEL (L1) + } + + 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/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.kt index d83471dcab9..2afee9c3fac 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,4 @@ -// CURIOUS_ABOUT writeToParcel, createFromParcel, +// CURIOUS_ABOUT writeToParcel, createFromParcel, , describeContents import kotlinx.android.parcel.* import android.os.Parcelable diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.txt index e448fe0e11d..de7d18d0e67 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.txt @@ -45,7 +45,12 @@ public final class User : java/lang/Object, android/os/Parcelable { public void (java.lang.String p0, java.lang.String p1, int p2, boolean p3) - public final int describeContents() + public final int describeContents() { + LABEL (L0) + LDC (0) + IRETURN + LABEL (L1) + } public final int getAge() 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 40dbcedc090..e012660435e 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 @@ -36,6 +36,12 @@ public class ParcelBytecodeListingTestGenerated extends AbstractParcelBytecodeLi KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("customDescribeContents.kt") + public void testCustomDescribeContents() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.kt"); + doTest(fileName); + } + @TestMetadata("listInsideList.kt") public void testListInsideList() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.kt");