Rework DescriptorSerializerPlugin to be a part of Project's extensions

instead of statically registering it.

Static registering can cause subtle errors when plugin implementation
(e.g. SerializationDescriptorPluginForKotlinxSerialization) is registered
from multiple classloaders: in multi-module with daemon compilation scenario

 #KT-41857 Fixed
This commit is contained in:
Leonid Startsev
2020-10-15 17:01:37 +03:00
parent ef907e0c46
commit 4ec90b18bc
23 changed files with 115 additions and 67 deletions
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.library.metadata.KlibMetadataSerializerProtocol
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension
import org.jetbrains.kotlin.serialization.DescriptorSerializer
import org.jetbrains.kotlin.serialization.DescriptorSerializerPlugin
import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol
import org.jetbrains.kotlinx.serialization.compiler.diagnostic.SerializationPluginDeclarationChecker
@@ -30,6 +30,8 @@ class SerializationComponentRegistrar : ComponentRegistrar {
}
companion object {
internal val serializationDescriptorSerializer = SerializationDescriptorPluginForKotlinxSerialization()
fun registerExtensions(project: Project) {
SyntheticResolveExtension.registerExtension(project, SerializationResolveExtension())
@@ -39,13 +41,12 @@ class SerializationComponentRegistrar : ComponentRegistrar {
StorageComponentContainerContributor.registerExtension(project, SerializationPluginComponentContainerContributor())
DescriptorSerializerPlugin.registerExtension(project, serializationDescriptorSerializer)
registerProtoExtensions()
}
internal val serializationDescriptorSerializer = SerializationDescriptorPluginForKotlinxSerialization()
private fun registerProtoExtensions() {
DescriptorSerializer.registerSerializerPlugin(serializationDescriptorSerializer)
SerializationPluginMetadataExtensions.registerAllExtensions(JvmProtoBufUtil.EXTENSION_REGISTRY)
SerializationPluginMetadataExtensions.registerAllExtensions(JsSerializerProtocol.extensionRegistry)
SerializationPluginMetadataExtensions.registerAllExtensions(KlibMetadataSerializerProtocol.extensionRegistry)