From 60efab24eaac0adb4276046b707d60bba625becb Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Fri, 3 Apr 2020 16:30:43 +0300 Subject: [PATCH] Add @SerializableWith on objects too to be able to retrieve them via getAssociatedObject and serializer() function. Now object itself is a SerializerFactory. --- .../backend/ir/SerializableCompanionIrGenerator.kt | 2 +- .../compiler/resolve/KSerializationUtil.kt | 10 ++++++++++ .../compiler/resolve/KSerializerDescriptorResolver.kt | 7 ------- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableCompanionIrGenerator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableCompanionIrGenerator.kt index bc7abf0341e..b6579c8b057 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableCompanionIrGenerator.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableCompanionIrGenerator.kt @@ -110,7 +110,7 @@ class SerializableCompanionIrGenerator( } private fun generateSerializerFactoryIfNeeded(getterDescriptor: FunctionDescriptor) { - if (serializableDescriptor.declaredTypeParameters.isEmpty()) return + if (!companionDescriptor.needSerializerFactory()) return val serialFactoryDescriptor = companionDescriptor.unsubstitutedMemberScope.getContributedFunctions( SerialEntityNames.SERIALIZER_PROVIDER_NAME, NoLookupLocation.FROM_BACKEND diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializationUtil.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializationUtil.kt index b5441c7f79b..3af82af9455 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializationUtil.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializationUtil.kt @@ -22,9 +22,11 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotated import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.platform.konan.isNative import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass import org.jetbrains.kotlin.resolve.descriptorUtil.module +import org.jetbrains.kotlin.resolve.descriptorUtil.platform import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered import org.jetbrains.kotlin.types.* @@ -210,6 +212,14 @@ internal fun getSerializableClassDescriptorByCompanion(thisDescriptor: ClassDesc return classDescriptor } +internal fun ClassDescriptor.needSerializerFactory(): Boolean { + if (this.platform?.isNative() != true) return false + val serializableClass = getSerializableClassDescriptorByCompanion(this) ?: return false + if (serializableClass.isSerializableObject) return true + if (serializableClass.declaredTypeParameters.isEmpty()) return false + return true +} + internal fun getSerializableClassDescriptorBySerializer(serializerDescriptor: ClassDescriptor): ClassDescriptor? { val serializerForClass = serializerDescriptor.serializerForClass if (serializerForClass != null) return serializerForClass.toClassDescriptor 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 399f366179d..8000940d7c9 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 @@ -58,13 +58,6 @@ object KSerializerDescriptorResolver { } } - private fun ClassDescriptor.needSerializerFactory(): Boolean { - if (this.platform?.isNative() != true) return false - val serializableClass = getSerializableClassDescriptorByCompanion(this) ?: return false - if (serializableClass.declaredTypeParameters.isEmpty()) return false - return true - } - fun addSerializerFactorySuperType(classDescriptor: ClassDescriptor, supertypes: MutableList) { if (!classDescriptor.needSerializerFactory()) return val serializerFactoryClass =