From 0ecf20bd628b6bbf875f1e9ea37e1c88f125b54d Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Tue, 30 Apr 2019 12:55:00 +0300 Subject: [PATCH] Revert back visibility in deserialization ctor to public so inheritors can access it from other modules. Fix instantiating of polymorphic serializer with generics. Move context creation below as asked. --- .../kotlin/codegen/ConstructorCodegen.java | 4 +- .../compiler/backend/jvm/JVMCodegenUtil.kt | 40 +++++++++++-------- .../resolve/KSerializerDescriptorResolver.kt | 2 +- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ConstructorCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ConstructorCodegen.java index 8e53656771d..ee85ba3b713 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ConstructorCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ConstructorCodegen.java @@ -127,12 +127,12 @@ public class ConstructorCodegen { ) { if (!canHaveDeclaredConstructors(descriptor)) return; - ConstructorContext constructorContext = context.intoConstructor(constructorDescriptor, typeMapper); - KtSecondaryConstructor constructor = (KtSecondaryConstructor) descriptorToDeclaration(constructorDescriptor); // Synthetic constructors don't have corresponding declarations if (constructor == null) return; + ConstructorContext constructorContext = context.intoConstructor(constructorDescriptor, typeMapper); + functionCodegen.generateMethod( JvmDeclarationOriginKt.OtherOrigin(constructor, constructorDescriptor), constructorDescriptor, constructorContext, diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/JVMCodegenUtil.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/JVMCodegenUtil.kt index 28131bff7c4..6c8ac6aa126 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/JVMCodegenUtil.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/JVMCodegenUtil.kt @@ -263,23 +263,9 @@ internal fun AbstractSerialGenerator.stackValueSerializerInstance(codegen: Class dup() // instantiate all arg serializers on stack val signature = StringBuilder("(") - when (serializer.classId) { - 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)) - AsmUtil.wrapJavaClassIntoKClass(this) - signature.append(AsmTypes.K_CLASS_TYPE.descriptor) - } - referenceArraySerializerId -> { - // a special way to instantiate reference array serializer -- need an element KClass reference - aconst(codegen.typeMapper.mapType(kType.arguments[0].type, null, TypeMappingMode.GENERIC_ARGUMENT)) - AsmUtil.wrapJavaClassIntoKClass(this) - signature.append(AsmTypes.K_CLASS_TYPE.descriptor) - } - } - // all serializers get arguments with serializers of their generic types - argSerializers.forEach { (argType, argSerializer) -> + + fun instantiate(typeArgument: Pair) { + val (argType, argSerializer) = typeArgument assert( stackValueSerializerInstance( codegen, @@ -295,6 +281,26 @@ internal fun AbstractSerialGenerator.stackValueSerializerInstance(codegen: Class if (argType.isMarkedNullable) wrapStackValueIntoNullableSerializer() signature.append(kSerializerType.descriptor) } + + when (serializer.classId) { + 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)) + AsmUtil.wrapJavaClassIntoKClass(this) + signature.append(AsmTypes.K_CLASS_TYPE.descriptor) + } + referenceArraySerializerId -> { + // a special way to instantiate reference array serializer -- need an element KClass reference + aconst(codegen.typeMapper.mapType(kType.arguments[0].type, null, TypeMappingMode.GENERIC_ARGUMENT)) + AsmUtil.wrapJavaClassIntoKClass(this) + signature.append(AsmTypes.K_CLASS_TYPE.descriptor) + // Reference array serializer still needs serializer for its argument type + instantiate(argSerializers[0]) + } + // all serializers get arguments with serializers of their generic types + else -> argSerializers.forEach(::instantiate) + } signature.append(")V") // invoke constructor invokespecial(serializerType.internalName, "", signature.toString(), false) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt index f4166779043..c3ab84673e3 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt @@ -323,7 +323,7 @@ object KSerializerDescriptorResolver { functionDescriptor.initialize( consParams, - Visibilities.INTERNAL + Visibilities.PUBLIC ) functionDescriptor.returnType = classDescriptor.defaultType