From 7ef9fb5511f68451469d02ffc000b25e6e2b2e68 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Fri, 28 Jun 2019 16:55:21 +0300 Subject: [PATCH] Export deserialization constructor from JS module Fixes https://github.com/Kotlin/kotlinx.serialization/issues/443 --- .../compiler/backend/js/SerializableJsTranslator.kt | 3 ++- .../serialization/compiler/resolve/SearchUtils.kt | 12 ++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/js/SerializableJsTranslator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/js/SerializableJsTranslator.kt index 004631b326b..c93201071c4 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/js/SerializableJsTranslator.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/js/SerializableJsTranslator.kt @@ -121,6 +121,7 @@ class SerializableJsTranslator( f.name = context.getInnerNameForDescriptor(constructorDescriptor) context.addDeclarationStatement(f.makeStmt()) + context.export(constructorDescriptor) } private fun JsBlockBuilder.generateSuperNonSerializableCall(superClass: ClassDescriptor, thisParameter: JsExpression) { @@ -139,7 +140,7 @@ class SerializableJsTranslator( thisParameter: JsExpression, propertiesStart: Int ): Int { - val constrDesc = KSerializerDescriptorResolver.createLoadConstructorDescriptor(superClass, context.bindingContext()) + val constrDesc = superClass.constructors.single(ClassConstructorDescriptor::isSerializationCtor) val constrRef = context.getInnerNameForDescriptor(constrDesc).makeRef() val superProperties = bindingContext.serializablePropertiesFor(superClass).serializableProperties val superSlots = superProperties.bitMaskSlotCount() diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/SearchUtils.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/SearchUtils.kt index 4dc008087b2..cc1f5578ee2 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/SearchUtils.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/SearchUtils.kt @@ -13,13 +13,21 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.ValueArgument import org.jetbrains.kotlin.resolve.constants.KClassValue +import org.jetbrains.kotlin.resolve.descriptorUtil.classId import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinTypeFactory -internal fun ClassConstructorDescriptor.isSerializationCtor(): Boolean = - kind == CallableMemberDescriptor.Kind.SYNTHESIZED && valueParameters.lastOrNull()?.name == SerialEntityNames.dummyParamName +internal fun ClassConstructorDescriptor.isSerializationCtor(): Boolean { + /*kind == CallableMemberDescriptor.Kind.SYNTHESIZED does not work because DeserializedClassConstructorDescriptor loses its kind*/ + return valueParameters.lastOrNull()?.run { + name == SerialEntityNames.dummyParamName && type.constructor.declarationDescriptor?.classId == ClassId( + SerializationPackages.packageFqName, + SerialEntityNames.SERIAL_CTOR_MARKER_NAME + ) + } == true +} // finds constructor (KSerializer, KSerializer...) on a KSerializer> internal fun findSerializerConstructorForTypeArgumentsSerializers(