New instantiating type for polymorphic serializer
This commit is contained in:
+2
-1
@@ -37,6 +37,7 @@ import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
|
|||||||
import org.jetbrains.kotlinx.serialization.compiler.backend.common.findTypeSerializerOrContext
|
import org.jetbrains.kotlinx.serialization.compiler.backend.common.findTypeSerializerOrContext
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.contextSerializerId
|
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.contextSerializerId
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.enumSerializerId
|
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.enumSerializerId
|
||||||
|
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.polymorphicSerializerId
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.referenceArraySerializerId
|
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.referenceArraySerializerId
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.resolve.*
|
import org.jetbrains.kotlinx.serialization.compiler.resolve.*
|
||||||
|
|
||||||
@@ -466,7 +467,7 @@ interface IrBuilderExtension {
|
|||||||
} else {
|
} else {
|
||||||
var serializerClass = serializerClassOriginal
|
var serializerClass = serializerClassOriginal
|
||||||
var args: List<IrExpression> = when (serializerClassOriginal.classId) {
|
var args: List<IrExpression> = when (serializerClassOriginal.classId) {
|
||||||
contextSerializerId -> listOf(classReference(kType))
|
contextSerializerId, polymorphicSerializerId -> listOf(classReference(kType))
|
||||||
enumSerializerId -> {
|
enumSerializerId -> {
|
||||||
serializerClass = serializableDescriptor.getClassFromInternalSerializationPackage("CommonEnumSerializer")
|
serializerClass = serializableDescriptor.getClassFromInternalSerializationPackage("CommonEnumSerializer")
|
||||||
kType.toClassDescriptor!!.let { enumDesc ->
|
kType.toClassDescriptor!!.let { enumDesc ->
|
||||||
|
|||||||
+4
-1
@@ -35,6 +35,7 @@ import org.jetbrains.kotlinx.serialization.compiler.backend.common.findTypeSeria
|
|||||||
import org.jetbrains.kotlinx.serialization.compiler.backend.common.primaryPropertiesDescriptorsMap
|
import org.jetbrains.kotlinx.serialization.compiler.backend.common.primaryPropertiesDescriptorsMap
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.contextSerializerId
|
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.contextSerializerId
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.enumSerializerId
|
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.enumSerializerId
|
||||||
|
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.polymorphicSerializerId
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.referenceArraySerializerId
|
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.referenceArraySerializerId
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.resolve.*
|
import org.jetbrains.kotlinx.serialization.compiler.resolve.*
|
||||||
|
|
||||||
@@ -133,6 +134,8 @@ internal fun SerializerJsTranslator.serializerTower(property: SerializableProper
|
|||||||
?.let { expr -> if (property.type.isMarkedNullable) JsNew(nullableSerClass, listOf(expr)) else expr }
|
?.let { expr -> if (property.type.isMarkedNullable) JsNew(nullableSerClass, listOf(expr)) else expr }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val classIdsWhichNeedKClass = setOf(enumSerializerId, contextSerializerId, polymorphicSerializerId)
|
||||||
|
|
||||||
internal fun SerializerJsTranslator.serializerInstance(
|
internal fun SerializerJsTranslator.serializerInstance(
|
||||||
serializerClass: ClassDescriptor?,
|
serializerClass: ClassDescriptor?,
|
||||||
module: ModuleDescriptor,
|
module: ModuleDescriptor,
|
||||||
@@ -148,7 +151,7 @@ internal fun SerializerJsTranslator.serializerInstance(
|
|||||||
if (serializerClass.kind == ClassKind.OBJECT) {
|
if (serializerClass.kind == ClassKind.OBJECT) {
|
||||||
return context.serializerObjectGetter(serializerClass)
|
return context.serializerObjectGetter(serializerClass)
|
||||||
} else {
|
} else {
|
||||||
var args = if (serializerClass.classId == enumSerializerId || serializerClass.classId == contextSerializerId)
|
var args = if (serializerClass.classId in classIdsWhichNeedKClass)
|
||||||
listOf(ExpressionVisitor.getObjectKClass(context, kType.toClassDescriptor!!))
|
listOf(ExpressionVisitor.getObjectKClass(context, kType.toClassDescriptor!!))
|
||||||
else kType.arguments.map {
|
else kType.arguments.map {
|
||||||
val argSer = findTypeSerializerOrContext(module, it.type, sourceElement = serializerClass.findPsi())
|
val argSer = findTypeSerializerOrContext(module, it.type, sourceElement = serializerClass.findPsi())
|
||||||
|
|||||||
+1
-1
@@ -264,7 +264,7 @@ internal fun AbstractSerialGenerator.stackValueSerializerInstance(codegen: Class
|
|||||||
// instantiate all arg serializers on stack
|
// instantiate all arg serializers on stack
|
||||||
val signature = StringBuilder("(")
|
val signature = StringBuilder("(")
|
||||||
when (serializer.classId) {
|
when (serializer.classId) {
|
||||||
enumSerializerId, contextSerializerId -> {
|
enumSerializerId, contextSerializerId, polymorphicSerializerId -> {
|
||||||
// a special way to instantiate enum -- need a enum KClass reference
|
// a special way to instantiate enum -- need a enum KClass reference
|
||||||
// GENERIC_ARGUMENT forces boxing in order to obtain KClass
|
// GENERIC_ARGUMENT forces boxing in order to obtain KClass
|
||||||
aconst(codegen.typeMapper.mapType(kType, null, TypeMappingMode.GENERIC_ARGUMENT))
|
aconst(codegen.typeMapper.mapType(kType, null, TypeMappingMode.GENERIC_ARGUMENT))
|
||||||
|
|||||||
Reference in New Issue
Block a user