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(