Add new serialization runtime packages

encoding and descriptors. Rename ContextSerializer to Contextual.
Unify getClassFrom*Package functions.
This commit is contained in:
Leonid Startsev
2020-07-15 15:29:03 +03:00
parent 8b9fb6a6cd
commit 7db0bf8195
3 changed files with 25 additions and 24 deletions
@@ -42,14 +42,14 @@ import org.jetbrains.org.objectweb.asm.Type
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
// todo: extract packages constants too? // 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 descImplType = Type.getObjectType("kotlinx/serialization/internal/$SERIAL_DESCRIPTOR_CLASS_IMPL")
internal val descriptorForEnumsType = Type.getObjectType("kotlinx/serialization/internal/$SERIAL_DESCRIPTOR_FOR_ENUM") 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 generatedSerializerType = Type.getObjectType("kotlinx/serialization/internal/${SerialEntityNames.GENERATED_SERIALIZER_CLASS}")
internal val kOutputType = Type.getObjectType("kotlinx/serialization/$STRUCTURE_ENCODER_CLASS") internal val kOutputType = Type.getObjectType("kotlinx/serialization/encoding/$STRUCTURE_ENCODER_CLASS")
internal val encoderType = Type.getObjectType("kotlinx/serialization/$ENCODER_CLASS") internal val encoderType = Type.getObjectType("kotlinx/serialization/encoding/$ENCODER_CLASS")
internal val decoderType = Type.getObjectType("kotlinx/serialization/$DECODER_CLASS") internal val decoderType = Type.getObjectType("kotlinx/serialization/encoding/$DECODER_CLASS")
internal val kInputType = Type.getObjectType("kotlinx/serialization/$STRUCTURE_DECODER_CLASS") internal val kInputType = Type.getObjectType("kotlinx/serialization/encoding/$STRUCTURE_DECODER_CLASS")
internal val kSerialSaverType = Type.getObjectType("kotlinx/serialization/$SERIAL_SAVER_CLASS") internal val kSerialSaverType = Type.getObjectType("kotlinx/serialization/$SERIAL_SAVER_CLASS")
@@ -11,7 +11,11 @@ import org.jetbrains.kotlin.name.Name
object SerializationPackages { object SerializationPackages {
internal val packageFqName = FqName("kotlinx.serialization") internal val packageFqName = FqName("kotlinx.serialization")
internal val internalPackageFqName = FqName("kotlinx.serialization.internal") 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") internal val builtinsPackageFqName = FqName("kotlinx.serialization.builtins")
val allPublicPackages = listOf(packageFqName, encodingPackageFqName, descriptorsPackageFqName, builtinsPackageFqName)
} }
object SerializationAnnotations { object SerializationAnnotations {
@@ -89,7 +93,7 @@ object SpecialBuiltins {
const val enumSerializer = "EnumSerializer" const val enumSerializer = "EnumSerializer"
const val polymorphicSerializer = "PolymorphicSerializer" const val polymorphicSerializer = "PolymorphicSerializer"
const val sealedSerializer = "SealedClassSerializer" const val sealedSerializer = "SealedClassSerializer"
const val contextSerializer = "ContextSerializer" const val contextSerializer = "ContextualSerializer"
const val nullableSerializer = "NullableSerializer" const val nullableSerializer = "NullableSerializer"
} }
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.KotlinTypeFactory import org.jetbrains.kotlin.types.KotlinTypeFactory
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
internal fun ClassConstructorDescriptor.isSerializationCtor(): Boolean { internal fun ClassConstructorDescriptor.isSerializationCtor(): Boolean {
/*kind == CallableMemberDescriptor.Kind.SYNTHESIZED does not work because DeserializedClassConstructorDescriptor loses its kind*/ /*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)) SerializationPackages.internalPackageFqName.child(Name.identifier(classSimpleName))
internal fun ModuleDescriptor.getClassFromInternalSerializationPackage(classSimpleName: String) = 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 = internal fun getSerializationPackageFqn(classSimpleName: String): FqName =
SerializationPackages.packageFqName.child(Name.identifier(classSimpleName)) SerializationPackages.packageFqName.child(Name.identifier(classSimpleName))
internal fun ModuleDescriptor.getClassFromSerializationPackage(classSimpleName: String) = internal fun ModuleDescriptor.getClassFromSerializationPackage(classSimpleName: String) =
getFromPackage(SerializationPackages.packageFqName, classSimpleName) SerializationPackages.allPublicPackages.firstNotNullResult { pkg ->
module.findClassAcrossModuleDependencies(ClassId(
private fun ModuleDescriptor.getFromPackage(packageFqName: FqName, classSimpleName: String) = requireNotNull( pkg,
findClassAcrossModuleDependencies(
ClassId(
packageFqName,
Name.identifier(classSimpleName) Name.identifier(classSimpleName)
) ))
) } ?: throw IllegalArgumentException("Can't locate class $classSimpleName")
) { "Can't locate class $classSimpleName from package $packageFqName" }
internal fun ClassDescriptor.getClassFromSerializationPackage(classSimpleName: String) = internal fun ClassDescriptor.getClassFromSerializationPackage(classSimpleName: String) =
requireNotNull( module.getClassFromSerializationPackage(classSimpleName)
module.findClassAcrossModuleDependencies(
ClassId(
SerializationPackages.packageFqName,
Name.identifier(classSimpleName)
)
)
) { "Can't locate class $classSimpleName" }
internal fun ClassDescriptor.getClassFromInternalSerializationPackage(classSimpleName: String) = internal fun ClassDescriptor.getClassFromInternalSerializationPackage(classSimpleName: String) =
module.getClassFromInternalSerializationPackage(classSimpleName) module.getClassFromInternalSerializationPackage(classSimpleName)