[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:
committed by
Space Team
parent
175c00e5c7
commit
6417f6456f
+17
@@ -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
|
||||
|
||||
+3
@@ -82,6 +82,9 @@ fun ClassDescriptor.getKSerializer(): ClassDescriptor =
|
||||
)
|
||||
)!!
|
||||
|
||||
fun ClassDescriptor.findNamedCompanionAnnotation(): ClassDescriptor? =
|
||||
module.findClassAcrossModuleDependencies(SerializationAnnotations.namedCompanionClassId)
|
||||
|
||||
fun ModuleDescriptor.getJsExportIgnore(): ClassDescriptor? =
|
||||
findClassAcrossModuleDependencies(SerializationJsDependenciesClassIds.jsExportIgnore)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user