From a743669bc9de66dfeaa452c041bb494bb60a75f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Wed, 25 Aug 2021 14:32:10 +0200 Subject: [PATCH] Parcelize: Fix type signatures in parcelable creator objects These objects are visible from annotation processors and should not refer to the type parameters of enclosing parcelable classes. --- .../parcelize/ir/ParcelizeIrTransformer.kt | 8 +++-- .../testData/codegen/generics.ir.txt | 33 ++++++++++++++++--- .../testData/codegen/generics.kt | 1 + .../testData/codegen/generics.txt | 32 +++++++++++++++--- 4 files changed, 63 insertions(+), 11 deletions(-) diff --git a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/ParcelizeIrTransformer.kt b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/ParcelizeIrTransformer.kt index 6d04529add1..ec74f109881 100644 --- a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/ParcelizeIrTransformer.kt +++ b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/ParcelizeIrTransformer.kt @@ -191,7 +191,9 @@ class ParcelizeIrTransformer(private val context: IrPluginContext, private val a } } - val creatorType = androidSymbols.androidOsParcelableCreator.typeWith(declaration.defaultType) + // Since the `CREATOR` object cannot refer to the type parameters of the parcelable class we use a star projected type + val declarationType = declaration.symbol.starProjectedType + val creatorType = androidSymbols.androidOsParcelableCreator.typeWith(declarationType) if (!declaration.descriptor.hasCreatorField()) { declaration.addField { @@ -217,7 +219,7 @@ class ParcelizeIrTransformer(private val context: IrPluginContext, private val a } } - val arrayType = context.irBuiltIns.arrayClass.typeWith(declaration.defaultType.makeNullable()) + val arrayType = context.irBuiltIns.arrayClass.typeWith(declarationType.makeNullable()) addFunction("newArray", arrayType).apply { overriddenSymbols = listOf(androidSymbols.androidOsParcelableCreator.getSimpleFunction(name.asString())!!) val sizeParameter = addValueParameter("size", context.irBuiltIns.intType) @@ -232,7 +234,7 @@ class ParcelizeIrTransformer(private val context: IrPluginContext, private val a } } - addFunction("createFromParcel", declaration.defaultType).apply { + addFunction("createFromParcel", declarationType).apply { overriddenSymbols = listOf(androidSymbols.androidOsParcelableCreator.getSimpleFunction(name.asString())!!) val parcelParameter = addValueParameter("parcel", androidSymbols.androidOsParcel.defaultType) diff --git a/plugins/parcelize/parcelize-compiler/testData/codegen/generics.ir.txt b/plugins/parcelize/parcelize-compiler/testData/codegen/generics.ir.txt index bad5e36bceb..b56dfc5c099 100644 --- a/plugins/parcelize/parcelize-compiler/testData/codegen/generics.ir.txt +++ b/plugins/parcelize/parcelize-compiler/testData/codegen/generics.ir.txt @@ -1,7 +1,11 @@ +Ljava/lang/Object;Landroid/os/Parcelable$Creator;>; public final class Box$Creator : java/lang/Object, android/os/Parcelable$Creator { public void () - public final Box createFromParcel(android.os.Parcel parcel) { + (Landroid/os/Parcel;)LBox<*>; + public final Box createFromParcel(android.os.Parcel parcel) + @Lorg/jetbrains/annotations/NotNull;([]) // invisible + @Lorg/jetbrains/annotations/NotNull;([]) // invisible, parameter 0 { LABEL (L0) ALOAD (1) LDC (parcel) @@ -26,37 +30,58 @@ public final class Box$Creator : java/lang/Object, android/os/Parcelable$Creator LABEL (L1) } + (I)[LBox<*>; public final Box[] newArray(int size) + @Lorg/jetbrains/annotations/NotNull;([]) // invisible public java.lang.Object[] newArray(int size) } +Ljava/lang/Object;Landroid/os/Parcelable; public final class Box : java/lang/Object, android/os/Parcelable { - public final static android.os.Parcelable$Creator CREATOR + @Lkotlinx/parcelize/Parcelize;([]) // invisible + Landroid/os/Parcelable$Creator;>; + public final static android.os.Parcelable$Creator CREATOR + @Lorg/jetbrains/annotations/NotNull;([]) // invisible + + TT; private final android.os.Parcelable box + @Lorg/jetbrains/annotations/NotNull;([]) // invisible static void () + (TT;)V public void (android.os.Parcelable box) + @Lorg/jetbrains/annotations/NotNull;([]) // invisible, parameter 0 + ()TT; public final android.os.Parcelable component1() + @Lorg/jetbrains/annotations/NotNull;([]) // invisible + (TT;)LBox; public final Box copy(android.os.Parcelable box) + @Lorg/jetbrains/annotations/NotNull;([]) // invisible + @Lorg/jetbrains/annotations/NotNull;([]) // invisible, parameter 0 public static Box copy$default(Box p0, android.os.Parcelable p1, int p2, java.lang.Object p3) public int describeContents() public boolean equals(java.lang.Object other) + @Lorg/jetbrains/annotations/Nullable;([]) // invisible, parameter 0 + ()TT; public final android.os.Parcelable getBox() + @Lorg/jetbrains/annotations/NotNull;([]) // invisible public int hashCode() public java.lang.String toString() + @Lorg/jetbrains/annotations/NotNull;([]) // invisible - public void writeToParcel(android.os.Parcel out, int flags) { + public void writeToParcel(android.os.Parcel out, int flags) + @Lorg/jetbrains/annotations/NotNull;([]) // invisible, parameter 0 { LABEL (L0) ALOAD (1) LDC (out) @@ -69,4 +94,4 @@ public final class Box : java/lang/Object, android/os/Parcelable { RETURN LABEL (L1) } -} +} \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/codegen/generics.kt b/plugins/parcelize/parcelize-compiler/testData/codegen/generics.kt index f31138e1923..442bc934b1e 100644 --- a/plugins/parcelize/parcelize-compiler/testData/codegen/generics.kt +++ b/plugins/parcelize/parcelize-compiler/testData/codegen/generics.kt @@ -1,4 +1,5 @@ // CURIOUS_ABOUT writeToParcel, createFromParcel +// RENDER_ANNOTATIONS // WITH_RUNTIME import kotlinx.parcelize.* diff --git a/plugins/parcelize/parcelize-compiler/testData/codegen/generics.txt b/plugins/parcelize/parcelize-compiler/testData/codegen/generics.txt index 5154afa5390..a60f29c035a 100644 --- a/plugins/parcelize/parcelize-compiler/testData/codegen/generics.txt +++ b/plugins/parcelize/parcelize-compiler/testData/codegen/generics.txt @@ -1,7 +1,11 @@ +Ljava/lang/Object;Landroid/os/Parcelable$Creator; public final class Box$Creator : java/lang/Object, android/os/Parcelable$Creator { public void () - public final Box createFromParcel(android.os.Parcel in) { + (Landroid/os/Parcel;)LBox<*>; + public final Box createFromParcel(android.os.Parcel in) + @Lorg/jetbrains/annotations/NotNull;([]) // invisible + @Lorg/jetbrains/annotations/NotNull;([]) // invisible, parameter 0 { LABEL (L0) ALOAD (1) LDC (in) @@ -19,44 +23,64 @@ public final class Box$Creator : java/lang/Object, android/os/Parcelable$Creator public java.lang.Object createFromParcel(android.os.Parcel p0) { LABEL (L0) - LINENUMBER (8) + LINENUMBER (9) ALOAD (0) ALOAD (1) INVOKEVIRTUAL (Box$Creator, createFromParcel, (Landroid/os/Parcel;)LBox;) ARETURN } + (I)[LBox<*>; public final Box[] newArray(int size) + @Lorg/jetbrains/annotations/NotNull;([]) // invisible public java.lang.Object[] newArray(int p0) } +Ljava/lang/Object;Landroid/os/Parcelable; public final class Box : java/lang/Object, android/os/Parcelable { + @Lkotlinx/parcelize/Parcelize;([]) // invisible + + Landroid/os/Parcelable$Creator; public final static android.os.Parcelable$Creator CREATOR + TT; private final android.os.Parcelable box + @Lorg/jetbrains/annotations/NotNull;([]) // invisible static void () + (TT;)V public void (android.os.Parcelable box) + @Lorg/jetbrains/annotations/NotNull;([]) // invisible, parameter 0 + ()TT; public final android.os.Parcelable component1() + @Lorg/jetbrains/annotations/NotNull;([]) // invisible + (TT;)LBox; public final Box copy(android.os.Parcelable box) + @Lorg/jetbrains/annotations/NotNull;([]) // invisible + @Lorg/jetbrains/annotations/NotNull;([]) // invisible, parameter 0 public static Box copy$default(Box p0, android.os.Parcelable p1, int p2, java.lang.Object p3) public int describeContents() public boolean equals(java.lang.Object p0) + @Lorg/jetbrains/annotations/Nullable;([]) // invisible, parameter 0 + ()TT; public final android.os.Parcelable getBox() + @Lorg/jetbrains/annotations/NotNull;([]) // invisible public int hashCode() public java.lang.String toString() + @Lorg/jetbrains/annotations/NotNull;([]) // invisible - public void writeToParcel(android.os.Parcel parcel, int flags) { + public void writeToParcel(android.os.Parcel parcel, int flags) + @Lorg/jetbrains/annotations/NotNull;([]) // invisible, parameter 0 { LABEL (L0) ALOAD (1) LDC (parcel) @@ -69,4 +93,4 @@ public final class Box : java/lang/Object, android/os/Parcelable { RETURN LABEL (L1) } -} +} \ No newline at end of file