From 1535426a11fcf52025cb05bfa261cd9b17ab1cd4 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Thu, 8 Nov 2018 17:43:30 +0300 Subject: [PATCH] Don't add GeneratedSerializer as a supertype for user-defined serializers --- .../compiler/resolve/KSerializationUtil.kt | 8 +++++--- .../resolve/KSerializerDescriptorResolver.kt | 15 ++++++++++----- 2 files changed, 15 insertions(+), 8 deletions(-) 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 7456b9f1075..1079d76cc02 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 @@ -41,14 +41,16 @@ fun isKSerializer(type: KotlinType?): Boolean = fun isGeneratedKSerializer(type: KotlinType?): Boolean = type != null && KotlinBuiltIns.isConstructedFromGivenClass(type, SerialEntityNames.GENERATED_SERIALIZER_FQ) -fun ClassDescriptor.getKSerializerDescriptor(): ClassDescriptor = +fun ClassDescriptor.getGeneratedSerializerDescriptor(): ClassDescriptor = module.getClassFromInternalSerializationPackage(SerialEntityNames.GENERATED_SERIALIZER_CLASS.identifier) -fun ClassDescriptor.createGeneratedSerializerTypeFor(argument: SimpleType): SimpleType { +fun ClassDescriptor.createSerializerTypeFor(argument: SimpleType, baseSerializerInterface: FqName): SimpleType { val projectionType = Variance.INVARIANT val types = listOf(TypeProjectionImpl(projectionType, argument)) - return KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, getKSerializerDescriptor(), types) + val descriptor = module.findClassAcrossModuleDependencies(ClassId.topLevel(baseSerializerInterface)) + ?: throw IllegalArgumentException("Can't locate $baseSerializerInterface") + return KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, descriptor, types) } internal fun extractKSerializerArgumentFromImplementation(implementationClass: ClassDescriptor): KotlinType? { 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 b4750861453..bb60f6d1f5f 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 @@ -57,9 +57,14 @@ object KSerializerDescriptorResolver { fun addSerializerSupertypes(classDescriptor: ClassDescriptor, supertypes: MutableList) { val serializableClassDescriptor = getSerializableClassDescriptorBySerializer(classDescriptor) ?: return - if (supertypes.none(::isKSerializer)) { - supertypes.add(classDescriptor.createGeneratedSerializerTypeFor(serializableClassDescriptor.defaultType)) - } + if (supertypes.any(::isKSerializer)) return + + // Add GeneratedSerializer as superinterface for generated $serializer class, and KSerializer to all others + val fqName = if (classDescriptor.name == SerialEntityNames.SERIALIZER_CLASS_NAME) + SerialEntityNames.GENERATED_SERIALIZER_FQ + else + SerialEntityNames.KSERIALIZER_NAME_FQ + supertypes.add(classDescriptor.createSerializerTypeFor(serializableClassDescriptor.defaultType, fqName)) } fun addSerialInfoImplClass( @@ -196,7 +201,7 @@ object KSerializerDescriptorResolver { name: Name ): PropertyDescriptor { val typeParam = listOf(createProjection(classDescriptor.defaultType, Variance.INVARIANT, null)) - val propertyFromSerializer = companionDescriptor.getKSerializerDescriptor().getMemberScope(typeParam) + val propertyFromSerializer = companionDescriptor.getGeneratedSerializerDescriptor().getMemberScope(typeParam) .getContributedVariables(name, NoLookupLocation.FROM_BUILTINS).single() val propertyDescriptor = PropertyDescriptorImpl.create( @@ -236,7 +241,7 @@ object KSerializerDescriptorResolver { ?: throw AssertionError("Serializer does not implement ${SerialEntityNames.KSERIALIZER_CLASS}??") val typeParam = listOf(createProjection(serializableClassOnImplSite, Variance.INVARIANT, null)) - val functionFromSerializer = companionDescriptor.getKSerializerDescriptor().getMemberScope(typeParam) + val functionFromSerializer = companionDescriptor.getGeneratedSerializerDescriptor().getMemberScope(typeParam) .getContributedFunctions(name, NoLookupLocation.FROM_BUILTINS).single() functionDescriptor.initialize(