[KxSerialization] Implemented addition of annotations to the named companion

For a more efficient lookup of a companion with the functions of obtaining a serializer, a special annotation is added to the named companions.


Merge-request: KT-MR-11003
Merged-by: Sergey Shanshin <Sergey.Shanshin@jetbrains.com>
This commit is contained in:
Sergey.Shanshin
2023-07-28 15:53:09 +00:00
committed by Space Team
parent 175c00e5c7
commit 6417f6456f
7 changed files with 170 additions and 0 deletions
@@ -9,15 +9,21 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.SerializationPluginMetadataExtensions
import org.jetbrains.kotlin.metadata.deserialization.Flags
import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.serialization.DescriptorSerializer
import org.jetbrains.kotlin.serialization.DescriptorSerializerPlugin
import org.jetbrains.kotlin.serialization.SerializerExtension
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializableProperties
import org.jetbrains.kotlinx.serialization.compiler.resolve.findNamedCompanionAnnotation
import org.jetbrains.kotlinx.serialization.compiler.resolve.isInternalSerializable
import org.jetbrains.kotlinx.serialization.compiler.resolve.shouldHaveGeneratedMethodsInCompanion
class SerializationDescriptorSerializerPlugin : DescriptorSerializerPlugin {
private val hasAnnotationFlag = Flags.HAS_ANNOTATIONS.toFlags(true)
private val descriptorMetadataMap: MutableMap<ClassDescriptor, SerializableProperties> = hashMapOf()
private val ClassDescriptor.needSaveProgramOrder: Boolean
@@ -37,6 +43,17 @@ class SerializationDescriptorSerializerPlugin : DescriptorSerializerPlugin {
) {
fun Name.toIndex() = extension.stringTable.getStringIndex(asString())
if (descriptor.isCompanionObject
&& descriptor.name != SpecialNames.DEFAULT_NAME_FOR_COMPANION_OBJECT
&& (descriptor.containingDeclaration as? ClassDescriptor)?.shouldHaveGeneratedMethodsInCompanion == true
) {
// named companion objects are always marked by special annotation in backend
// in order for this annotation to be visible in runtime through reflection, it is necessary to put down the hasAnnotation flag
if (proto.flags and hasAnnotationFlag == 0 && descriptor.findNamedCompanionAnnotation() != null) {
proto.flags = proto.flags or hasAnnotationFlag
}
}
if (!descriptor.needSaveProgramOrder) return
val propertiesCorrectOrder = (descriptorMetadataMap[descriptor] ?: return).serializableProperties
@@ -82,6 +82,9 @@ fun ClassDescriptor.getKSerializer(): ClassDescriptor =
)
)!!
fun ClassDescriptor.findNamedCompanionAnnotation(): ClassDescriptor? =
module.findClassAcrossModuleDependencies(SerializationAnnotations.namedCompanionClassId)
fun ModuleDescriptor.getJsExportIgnore(): ClassDescriptor? =
findClassAcrossModuleDependencies(SerializationJsDependenciesClassIds.jsExportIgnore)