Handle non-reified type parameters of function inside serializer<T>() intrinsic

to match an error message thrown from KType-based serializer<T>().

Fixes https://github.com/Kotlin/kotlinx.serialization/issues/2528
This commit is contained in:
Leonid Startsev
2023-12-18 19:04:30 +01:00
committed by Space Team
parent a2cd2200d6
commit 6c6f2ccacd
11 changed files with 429 additions and 18 deletions
@@ -0,0 +1,86 @@
public final class Box$$serializer : java/lang/Object, kotlinx/serialization/internal/GeneratedSerializer {
private final kotlinx.serialization.descriptors.SerialDescriptor descriptor
private final kotlinx.serialization.KSerializer typeSerial0
private void <init>()
public void <init>(kotlinx.serialization.KSerializer typeSerial0)
public final kotlinx.serialization.KSerializer[] childSerializers()
public final Box deserialize(kotlinx.serialization.encoding.Decoder decoder)
public java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder decoder)
public final kotlinx.serialization.descriptors.SerialDescriptor getDescriptor()
private final kotlinx.serialization.KSerializer getTypeSerial0()
public final void serialize(kotlinx.serialization.encoding.Encoder encoder, Box value)
public void serialize(kotlinx.serialization.encoding.Encoder encoder, java.lang.Object value)
public final kotlinx.serialization.KSerializer[] typeParametersSerializers()
}
public final class Box$Companion : java/lang/Object {
private void <init>()
public void <init>(kotlin.jvm.internal.DefaultConstructorMarker $constructor_marker)
public final kotlinx.serialization.KSerializer serializer(kotlinx.serialization.KSerializer typeSerial0)
}
public final class Box : java/lang/Object {
private final static kotlinx.serialization.descriptors.SerialDescriptor $cachedDescriptor
public final static Box$Companion Companion
private final java.lang.Object t
static void <clinit>()
public void <init>(java.lang.Object t)
public void <init>(int seen0, java.lang.Object t, kotlinx.serialization.internal.SerializationConstructorMarker serializationConstructorMarker)
public final java.lang.Object getT()
public final static void write$Self$main(Box self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc, kotlinx.serialization.KSerializer typeSerial0)
}
public final class IntrinsicsNonReifiedKt : java/lang/Object {
public final static kotlinx.serialization.KSerializer inner() {
ICONST_0
ISTORE (0)
LABEL (L0)
LINENUMBER (12)
BIPUSH (6)
LDC (T)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, reifiedOperationMarker, (ILjava/lang/String;)V)
ACONST_NULL
LDC (kotlinx.serialization.serializer.simple)
INVOKESTATIC (kotlin/jvm/internal/MagicApiIntrinsics, voidMagicApiCall, (Ljava/lang/Object;)V)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ARETURN
LABEL (L1)
}
public final static kotlinx.serialization.KSerializer outer() {
LABEL (L0)
LINENUMBER (14)
ICONST_0
ISTORE (0)
LABEL (L1)
LINENUMBER (16)
GETSTATIC (Box, Companion, LBox$Companion;)
NEW (java/lang/IllegalArgumentException)
DUP
LDC (Captured type parameter T of <root>.IntrinsicsNonReifiedKt.outer from generic non-reified function. Such functionality cannot be supported because T is erased, either specify serializer explicitly or make calling function inline with reified T.)
INVOKESPECIAL (java/lang/IllegalArgumentException, <init>, (Ljava/lang/String;)V)
CHECKCAST (java/lang/Throwable)
ATHROW
LABEL (L2)
}
}
@@ -0,0 +1,86 @@
public final class Box$$serializer : java/lang/Object, kotlinx/serialization/internal/GeneratedSerializer {
private final kotlinx.serialization.internal.PluginGeneratedSerialDescriptor descriptor
private final kotlinx.serialization.KSerializer typeSerial0
private void <init>()
public void <init>(kotlinx.serialization.KSerializer typeSerial0)
public kotlinx.serialization.KSerializer[] childSerializers()
public Box deserialize(kotlinx.serialization.encoding.Decoder decoder)
public java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder decoder)
public kotlinx.serialization.descriptors.SerialDescriptor getDescriptor()
private final kotlinx.serialization.KSerializer getTypeSerial0()
public void serialize(kotlinx.serialization.encoding.Encoder encoder, Box value)
public void serialize(kotlinx.serialization.encoding.Encoder encoder, java.lang.Object value)
public kotlinx.serialization.KSerializer[] typeParametersSerializers()
}
public final class Box$Companion : java/lang/Object {
private void <init>()
public void <init>(kotlin.jvm.internal.DefaultConstructorMarker $constructor_marker)
public final kotlinx.serialization.KSerializer serializer(kotlinx.serialization.KSerializer typeSerial0)
}
public final class Box : java/lang/Object {
private final static kotlinx.serialization.descriptors.SerialDescriptor $cachedDescriptor
public final static Box$Companion Companion
private final java.lang.Object t
static void <clinit>()
public void <init>(java.lang.Object t)
public void <init>(int seen1, java.lang.Object t, kotlinx.serialization.internal.SerializationConstructorMarker serializationConstructorMarker)
public final java.lang.Object getT()
public final static void write$Self$main(Box self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc, kotlinx.serialization.KSerializer typeSerial0)
}
public final class IntrinsicsNonReifiedKt : java/lang/Object {
public final static kotlinx.serialization.KSerializer inner() {
ICONST_0
ISTORE (0)
LABEL (L0)
LINENUMBER (12)
BIPUSH (6)
LDC (T)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, reifiedOperationMarker, (ILjava/lang/String;)V)
ACONST_NULL
LDC (kotlinx.serialization.serializer.simple)
INVOKESTATIC (kotlin/jvm/internal/MagicApiIntrinsics, voidMagicApiCall, (Ljava/lang/Object;)V)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ARETURN
LABEL (L1)
}
public final static kotlinx.serialization.KSerializer outer() {
LABEL (L0)
LINENUMBER (14)
ICONST_0
ISTORE (0)
LABEL (L1)
LINENUMBER (16)
GETSTATIC (Box, Companion, LBox$Companion;)
NEW (java/lang/IllegalArgumentException)
DUP
LDC (Captured type parameter T of <root>.IntrinsicsNonReifiedKt.outer from generic non-reified function. Such functionality cannot be supported because T is erased, either specify serializer explicitly or make calling function inline with reified T.)
INVOKESPECIAL (java/lang/IllegalArgumentException, <init>, (Ljava/lang/String;)V)
CHECKCAST (java/lang/Throwable)
ATHROW
LABEL (L2)
}
}
@@ -0,0 +1,141 @@
public final class Box$$serializer : java/lang/Object, kotlinx/serialization/internal/GeneratedSerializer {
private final kotlinx.serialization.descriptors.SerialDescriptor $$serialDesc
private kotlinx.serialization.KSerializer typeSerial0
private void <init>()
public void <init>(kotlinx.serialization.KSerializer typeSerial0)
public kotlinx.serialization.KSerializer[] childSerializers()
public Box deserialize(kotlinx.serialization.encoding.Decoder decoder)
public java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder p0)
public kotlinx.serialization.descriptors.SerialDescriptor getDescriptor()
public void serialize(kotlinx.serialization.encoding.Encoder encoder, Box value)
public void serialize(kotlinx.serialization.encoding.Encoder p0, java.lang.Object p1)
public kotlinx.serialization.KSerializer[] typeParametersSerializers()
}
public final class Box$Companion : java/lang/Object {
private void <init>()
public void <init>(kotlin.jvm.internal.DefaultConstructorMarker $constructor_marker)
public final kotlinx.serialization.KSerializer serializer(kotlinx.serialization.KSerializer typeSerial0)
}
public final class Box : java/lang/Object {
private final static kotlinx.serialization.descriptors.SerialDescriptor $cachedDescriptor
public final static Box$Companion Companion
private final java.lang.Object t
static void <clinit>()
public void <init>(java.lang.Object t)
public void <init>(int seen1, java.lang.Object t, kotlinx.serialization.internal.SerializationConstructorMarker serializationConstructorMarker)
public final java.lang.Object getT()
public final static void write$Self$main(Box self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc, kotlinx.serialization.KSerializer typeSerial0)
}
public final class IntrinsicsNonReifiedKt : java/lang/Object {
public final static kotlinx.serialization.KSerializer inner() {
LDC (0)
ISTORE (0)
LABEL (L0)
LINENUMBER (12)
ICONST_0
ISTORE (1)
LABEL (L1)
BIPUSH (6)
LDC (T)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, reifiedOperationMarker, (ILjava/lang/String;)V)
ACONST_NULL
LABEL (L2)
LINENUMBER (16)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ASTORE (2)
LABEL (L3)
ICONST_0
ISTORE (3)
LABEL (L4)
LINENUMBER (17)
ALOAD (2)
LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
ALOAD (2)
CHECKCAST (kotlinx/serialization/KSerializer)
LABEL (L5)
LINENUMBER (16)
NOP
LABEL (L6)
LINENUMBER (12)
ARETURN
LABEL (L7)
}
public final static kotlinx.serialization.KSerializer outer() {
LABEL (L0)
LINENUMBER (14)
ICONST_0
ISTORE (0)
LABEL (L1)
LINENUMBER (18)
ICONST_0
ISTORE (1)
LABEL (L2)
LDC (LBox;)
GETSTATIC (kotlin/reflect/KTypeProjection, Companion, Lkotlin/reflect/KTypeProjection$Companion;)
NEW (kotlin/jvm/internal/FunctionReferenceImpl)
DUP
ICONST_0
LDC (LIntrinsicsNonReifiedKt;)
LDC (outer)
LDC (outer()Lkotlinx/serialization/KSerializer;)
ICONST_1
INVOKESPECIAL (kotlin/jvm/internal/FunctionReferenceImpl, <init>, (ILjava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V)
LDC (T)
GETSTATIC (kotlin/reflect/KVariance, INVARIANT, Lkotlin/reflect/KVariance;)
ICONST_0
INVOKESTATIC (kotlin/jvm/internal/Reflection, typeParameter, (Ljava/lang/Object;Ljava/lang/String;Lkotlin/reflect/KVariance;Z)Lkotlin/reflect/KTypeParameter;)
DUP
LDC (Ljava/lang/Object;)
INVOKESTATIC (kotlin/jvm/internal/Reflection, nullableTypeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;)
INVOKESTATIC (kotlin/jvm/internal/Reflection, setUpperBounds, (Lkotlin/reflect/KTypeParameter;Lkotlin/reflect/KType;)V)
INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Lkotlin/reflect/KClassifier;)Lkotlin/reflect/KType;)
INVOKEVIRTUAL (kotlin/reflect/KTypeProjection$Companion, invariant, (Lkotlin/reflect/KType;)Lkotlin/reflect/KTypeProjection;)
INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;Lkotlin/reflect/KTypeProjection;)Lkotlin/reflect/KType;)
LABEL (L3)
LINENUMBER (19)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ASTORE (2)
LABEL (L4)
ICONST_0
ISTORE (3)
LABEL (L5)
LINENUMBER (20)
ALOAD (2)
LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
ALOAD (2)
LABEL (L6)
LINENUMBER (19)
NOP
LABEL (L7)
LINENUMBER (18)
NOP
LABEL (L8)
LINENUMBER (14)
ARETURN
}
}
@@ -0,0 +1,14 @@
// CURIOUS_ABOUT: inner, outer
// WITH_STDLIB
import kotlinx.serialization.*
import kotlinx.serialization.json.*
import kotlinx.serialization.modules.*
import kotlin.reflect.typeOf
@Serializable
class Box<T>(val t: T)
inline fun <reified T> inner() = serializer<T>()
fun <T> outer() = inner<Box<T>>()