From ffc409673c26ddc5aebc8a6174c295d13149ae27 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 | 5 +++-- .../serialization/compiler/resolve/SearchUtils.kt | 12 ++++++++++-- 2 files changed, 13 insertions(+), 4 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 9897aabc98a7c..a6226d088f475 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 @@ -20,8 +20,8 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.codegen.CompilationException import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.js.backend.ast.* import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi import org.jetbrains.kotlin.js.translate.context.Namer @@ -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 = SerializableProperties(superClass, bindingContext).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 4dc008087b20c..cc1f5578ee2bc 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(