New instantiating type for polymorphic serializer

This commit is contained in:
Leonid Startsev
2018-11-20 20:00:01 +03:00
parent 30108d4cb9
commit 9d707cb1d9
3 changed files with 7 additions and 3 deletions
@@ -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.jvm.contextSerializerId
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.resolve.*
@@ -466,7 +467,7 @@ interface IrBuilderExtension {
} else {
var serializerClass = serializerClassOriginal
var args: List<IrExpression> = when (serializerClassOriginal.classId) {
contextSerializerId -> listOf(classReference(kType))
contextSerializerId, polymorphicSerializerId -> listOf(classReference(kType))
enumSerializerId -> {
serializerClass = serializableDescriptor.getClassFromInternalSerializationPackage("CommonEnumSerializer")
kType.toClassDescriptor!!.let { enumDesc ->
@@ -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.jvm.contextSerializerId
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.resolve.*
@@ -133,6 +134,8 @@ internal fun SerializerJsTranslator.serializerTower(property: SerializableProper
?.let { expr -> if (property.type.isMarkedNullable) JsNew(nullableSerClass, listOf(expr)) else expr }
}
private val classIdsWhichNeedKClass = setOf(enumSerializerId, contextSerializerId, polymorphicSerializerId)
internal fun SerializerJsTranslator.serializerInstance(
serializerClass: ClassDescriptor?,
module: ModuleDescriptor,
@@ -148,7 +151,7 @@ internal fun SerializerJsTranslator.serializerInstance(
if (serializerClass.kind == ClassKind.OBJECT) {
return context.serializerObjectGetter(serializerClass)
} else {
var args = if (serializerClass.classId == enumSerializerId || serializerClass.classId == contextSerializerId)
var args = if (serializerClass.classId in classIdsWhichNeedKClass)
listOf(ExpressionVisitor.getObjectKClass(context, kType.toClassDescriptor!!))
else kType.arguments.map {
val argSer = findTypeSerializerOrContext(module, it.type, sourceElement = serializerClass.findPsi())
@@ -264,7 +264,7 @@ internal fun AbstractSerialGenerator.stackValueSerializerInstance(codegen: Class
// instantiate all arg serializers on stack
val signature = StringBuilder("(")
when (serializer.classId) {
enumSerializerId, contextSerializerId -> {
enumSerializerId, contextSerializerId, polymorphicSerializerId -> {
// a special way to instantiate enum -- need a enum KClass reference
// GENERIC_ARGUMENT forces boxing in order to obtain KClass
aconst(codegen.typeMapper.mapType(kType, null, TypeMappingMode.GENERIC_ARGUMENT))