Skip to content

Commit f5c64f8

Browse files
committed
Parcelable: Allow custom describeContents() implementation
1 parent c1c6242 commit f5c64f8

File tree

6 files changed

+69
-3
lines changed

6 files changed

+69
-3
lines changed

plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableResolveExtension.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.android.parcel
1818

1919
import kotlinx.android.parcel.MagicParcel
2020
import org.jetbrains.kotlin.android.parcel.ParcelableSyntheticComponent.ComponentKind.*
21+
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
2122
import org.jetbrains.kotlin.descriptors.*
2223
import org.jetbrains.kotlin.descriptors.annotations.Annotations
2324
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
@@ -78,14 +79,18 @@ class ParcelableResolveExtension : SyntheticResolveExtension {
7879
fromSupertypes: List<SimpleFunctionDescriptor>,
7980
result: MutableCollection<SimpleFunctionDescriptor>
8081
) {
81-
if (name.asString() == DESCRIBE_CONTENTS.methodName && clazz.isMagicParcelable) {
82+
if (name.asString() == DESCRIBE_CONTENTS.methodName && clazz.isMagicParcelable && result.none { it.isDescribeContents() }) {
8283
result += createMethod(clazz, DESCRIBE_CONTENTS, clazz.builtIns.intType)
8384
} else if (name.asString() == WRITE_TO_PARCEL.methodName && clazz.isMagicParcelable) {
8485
val builtIns = clazz.builtIns
8586
val parcelClassType = resolveParcelClassType(clazz.module)
8687
result += createMethod(clazz, WRITE_TO_PARCEL, builtIns.unitType, "parcel" to parcelClassType, "flags" to builtIns.intType)
8788
}
8889
}
90+
91+
private fun SimpleFunctionDescriptor.isDescribeContents(): Boolean {
92+
return typeParameters.isEmpty() && valueParameters.isEmpty() && returnType?.let { type -> KotlinBuiltIns.isInt(type) } == true
93+
}
8994
}
9095

9196
interface ParcelableSyntheticComponent {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// CURIOUS_ABOUT describeContents
2+
3+
import kotlinx.android.parcel.*
4+
import android.os.Parcelable
5+
6+
@MagicParcel
7+
class User(val firstName: String, val lastName: String, val age: Int, val isProUser: Boolean) : Parcelable {
8+
override fun describeContents() = 100
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
public static class User$CREATOR : java/lang/Object, android/os/Parcelable$Creator {
2+
public void <init>()
3+
4+
public final User createFromParcel(android.os.Parcel p0)
5+
6+
public final User[] newArray(int p0)
7+
}
8+
9+
public final class User : java/lang/Object, android/os/Parcelable {
10+
public final static User$CREATOR CREATOR
11+
12+
private final int age
13+
14+
private final java.lang.String firstName
15+
16+
private final boolean isProUser
17+
18+
private final java.lang.String lastName
19+
20+
static void <clinit>()
21+
22+
public void <init>(java.lang.String p0, java.lang.String p1, int p2, boolean p3)
23+
24+
public int describeContents() {
25+
LABEL (L0)
26+
LINENUMBER (8)
27+
BIPUSH (100)
28+
IRETURN
29+
LABEL (L1)
30+
}
31+
32+
public final int getAge()
33+
34+
public final java.lang.String getFirstName()
35+
36+
public final java.lang.String getLastName()
37+
38+
public final boolean isProUser()
39+
40+
public final void writeToParcel(android.os.Parcel p0, int p1)
41+
}

plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// CURIOUS_ABOUT writeToParcel, createFromParcel, <clinit>
1+
// CURIOUS_ABOUT writeToParcel, createFromParcel, <clinit>, describeContents
22

33
import kotlinx.android.parcel.*
44
import android.os.Parcelable

plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,12 @@ public final class User : java/lang/Object, android/os/Parcelable {
4545

4646
public void <init>(java.lang.String p0, java.lang.String p1, int p2, boolean p3)
4747

48-
public final int describeContents()
48+
public final int describeContents() {
49+
LABEL (L0)
50+
LDC (0)
51+
IRETURN
52+
LABEL (L1)
53+
}
4954

5055
public final int getAge()
5156

plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/ParcelBytecodeListingTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ public void testAllFilesPresentInCodegen() throws Exception {
3636
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
3737
}
3838

39+
@TestMetadata("customDescribeContents.kt")
40+
public void testCustomDescribeContents() throws Exception {
41+
String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.kt");
42+
doTest(fileName);
43+
}
44+
3945
@TestMetadata("listInsideList.kt")
4046
public void testListInsideList() throws Exception {
4147
String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.kt");

0 commit comments

Comments
 (0)