From 7db0bf8195e732f20185400c3973dc41758249fe Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Wed, 15 Jul 2020 15:29:03 +0300 Subject: [PATCH] Add new serialization runtime packages encoding and descriptors. Rename ContextSerializer to Contextual. Unify getClassFrom*Package functions. --- .../compiler/backend/jvm/JVMCodegenUtil.kt | 10 +++--- .../compiler/resolve/NamingConventions.kt | 6 +++- .../compiler/resolve/SearchUtils.kt | 33 +++++++++---------- 3 files changed, 25 insertions(+), 24 deletions(-) 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 ca2a9460824..efa1203120a 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 @@ -42,14 +42,14 @@ import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter // todo: extract packages constants too? -internal val descType = Type.getObjectType("kotlinx/serialization/$SERIAL_DESCRIPTOR_CLASS") +internal val descType = Type.getObjectType("kotlinx/serialization/descriptors/$SERIAL_DESCRIPTOR_CLASS") internal val descImplType = Type.getObjectType("kotlinx/serialization/internal/$SERIAL_DESCRIPTOR_CLASS_IMPL") internal val descriptorForEnumsType = Type.getObjectType("kotlinx/serialization/internal/$SERIAL_DESCRIPTOR_FOR_ENUM") internal val generatedSerializerType = Type.getObjectType("kotlinx/serialization/internal/${SerialEntityNames.GENERATED_SERIALIZER_CLASS}") -internal val kOutputType = Type.getObjectType("kotlinx/serialization/$STRUCTURE_ENCODER_CLASS") -internal val encoderType = Type.getObjectType("kotlinx/serialization/$ENCODER_CLASS") -internal val decoderType = Type.getObjectType("kotlinx/serialization/$DECODER_CLASS") -internal val kInputType = Type.getObjectType("kotlinx/serialization/$STRUCTURE_DECODER_CLASS") +internal val kOutputType = Type.getObjectType("kotlinx/serialization/encoding/$STRUCTURE_ENCODER_CLASS") +internal val encoderType = Type.getObjectType("kotlinx/serialization/encoding/$ENCODER_CLASS") +internal val decoderType = Type.getObjectType("kotlinx/serialization/encoding/$DECODER_CLASS") +internal val kInputType = Type.getObjectType("kotlinx/serialization/encoding/$STRUCTURE_DECODER_CLASS") internal val kSerialSaverType = Type.getObjectType("kotlinx/serialization/$SERIAL_SAVER_CLASS") diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt index 9a3e2e8b3d8..dab16d9f867 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt @@ -11,7 +11,11 @@ import org.jetbrains.kotlin.name.Name object SerializationPackages { internal val packageFqName = FqName("kotlinx.serialization") internal val internalPackageFqName = FqName("kotlinx.serialization.internal") + internal val encodingPackageFqName = FqName("kotlinx.serialization.encoding") + internal val descriptorsPackageFqName = FqName("kotlinx.serialization.descriptors") internal val builtinsPackageFqName = FqName("kotlinx.serialization.builtins") + + val allPublicPackages = listOf(packageFqName, encodingPackageFqName, descriptorsPackageFqName, builtinsPackageFqName) } object SerializationAnnotations { @@ -89,7 +93,7 @@ object SpecialBuiltins { const val enumSerializer = "EnumSerializer" const val polymorphicSerializer = "PolymorphicSerializer" const val sealedSerializer = "SealedClassSerializer" - const val contextSerializer = "ContextSerializer" + const val contextSerializer = "ContextualSerializer" const val nullableSerializer = "NullableSerializer" } 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 497d1e9d3d2..7f200d55457 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 @@ -18,6 +18,7 @@ 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 +import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult internal fun ClassConstructorDescriptor.isSerializationCtor(): Boolean { /*kind == CallableMemberDescriptor.Kind.SYNTHESIZED does not work because DeserializedClassConstructorDescriptor loses its kind*/ @@ -72,32 +73,28 @@ internal fun getInternalPackageFqn(classSimpleName: String): FqName = SerializationPackages.internalPackageFqName.child(Name.identifier(classSimpleName)) internal fun ModuleDescriptor.getClassFromInternalSerializationPackage(classSimpleName: String) = - getFromPackage(SerializationPackages.internalPackageFqName, classSimpleName) + requireNotNull( + findClassAcrossModuleDependencies( + ClassId( + SerializationPackages.internalPackageFqName, + Name.identifier(classSimpleName) + ) + ) + ) { "Can't locate class $classSimpleName from package ${SerializationPackages.internalPackageFqName}" } internal fun getSerializationPackageFqn(classSimpleName: String): FqName = SerializationPackages.packageFqName.child(Name.identifier(classSimpleName)) internal fun ModuleDescriptor.getClassFromSerializationPackage(classSimpleName: String) = - getFromPackage(SerializationPackages.packageFqName, classSimpleName) - -private fun ModuleDescriptor.getFromPackage(packageFqName: FqName, classSimpleName: String) = requireNotNull( - findClassAcrossModuleDependencies( - ClassId( - packageFqName, + SerializationPackages.allPublicPackages.firstNotNullResult { pkg -> + module.findClassAcrossModuleDependencies(ClassId( + pkg, Name.identifier(classSimpleName) - ) - ) -) { "Can't locate class $classSimpleName from package $packageFqName" } + )) + } ?: throw IllegalArgumentException("Can't locate class $classSimpleName") internal fun ClassDescriptor.getClassFromSerializationPackage(classSimpleName: String) = - requireNotNull( - module.findClassAcrossModuleDependencies( - ClassId( - SerializationPackages.packageFqName, - Name.identifier(classSimpleName) - ) - ) - ) { "Can't locate class $classSimpleName" } + module.getClassFromSerializationPackage(classSimpleName) internal fun ClassDescriptor.getClassFromInternalSerializationPackage(classSimpleName: String) = module.getClassFromInternalSerializationPackage(classSimpleName)