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
// 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")
@@ -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"
}
@@ -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)