Better lookup for serializer() function in companion for generic classes because user can define a parameterless shorthand one
Fixes Kotlin/kotlinx.serialization/#228
This commit is contained in:
+9
-2
@@ -18,10 +18,11 @@ package org.jetbrains.kotlinx.serialization.compiler.backend.common
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.psi2ir.findSingleFunction
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.SERIALIZER_PROVIDER_NAME
|
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.SERIALIZER_PROVIDER_NAME
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.resolve.getSerializableClassDescriptorByCompanion
|
import org.jetbrains.kotlinx.serialization.compiler.resolve.getSerializableClassDescriptorByCompanion
|
||||||
|
import org.jetbrains.kotlinx.serialization.compiler.resolve.isKSerializer
|
||||||
|
|
||||||
abstract class SerializableCompanionCodegen(
|
abstract class SerializableCompanionCodegen(
|
||||||
protected val companionDescriptor: ClassDescriptor,
|
protected val companionDescriptor: ClassDescriptor,
|
||||||
@@ -30,7 +31,13 @@ abstract class SerializableCompanionCodegen(
|
|||||||
protected val serializableDescriptor: ClassDescriptor = getSerializableClassDescriptorByCompanion(companionDescriptor)!!
|
protected val serializableDescriptor: ClassDescriptor = getSerializableClassDescriptorByCompanion(companionDescriptor)!!
|
||||||
|
|
||||||
fun generate() {
|
fun generate() {
|
||||||
val serializerGetterDescriptor = companionDescriptor.unsubstitutedMemberScope.findSingleFunction(SERIALIZER_PROVIDER_NAME)
|
val serializerGetterDescriptor = companionDescriptor.unsubstitutedMemberScope.getContributedFunctions(
|
||||||
|
SERIALIZER_PROVIDER_NAME,
|
||||||
|
NoLookupLocation.FROM_BACKEND
|
||||||
|
).first { func ->
|
||||||
|
func.valueParameters.size == serializableDescriptor.declaredTypeParameters.size &&
|
||||||
|
func.valueParameters.all { isKSerializer(it.type) }
|
||||||
|
}
|
||||||
generateSerializerGetter(serializerGetterDescriptor)
|
generateSerializerGetter(serializerGetterDescriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user