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
+3
View File
@@ -5,7 +5,10 @@ plugins {
dependencies {
compile(project(":compiler:resolution"))
compile(project(":compiler:frontend"))
compile(project(":core:deserialization"))
compileOnly(intellijCoreDep()) { includeJars("intellij-core", rootProject = rootProject) }
}
sourceSets {
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.serialization
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.isSuspendFunctionType
import org.jetbrains.kotlin.builtins.isSuspendFunctionTypeOrSubtype
@@ -755,13 +756,6 @@ class DescriptorSerializer private constructor(
)
companion object {
private val plugins: MutableSet<DescriptorSerializerPlugin> = mutableSetOf()
@JvmStatic
fun registerSerializerPlugin(plugin: DescriptorSerializerPlugin) {
plugins.add(plugin)
}
@JvmStatic
fun createTopLevel(extension: SerializerExtension): DescriptorSerializer =
DescriptorSerializer(
@@ -778,13 +772,15 @@ class DescriptorSerializer private constructor(
fun create(
descriptor: ClassDescriptor,
extension: SerializerExtension,
parentSerializer: DescriptorSerializer?
parentSerializer: DescriptorSerializer?,
project: Project? = null
): DescriptorSerializer {
val container = descriptor.containingDeclaration
val parent = if (container is ClassDescriptor)
parentSerializer ?: create(container, extension, null)
parentSerializer ?: create(container, extension, null, project)
else
createTopLevel(extension)
val plugins = project?.let { DescriptorSerializerPlugin.getInstances(it) }.orEmpty()
// Calculate type parameter ids for the outer class beforehand, as it would've had happened if we were always
// serializing outer classes before nested classes.
@@ -797,7 +793,7 @@ class DescriptorSerializer private constructor(
if (container is ClassDescriptor && !isVersionRequirementTableWrittenCorrectly(extension.metadataVersion))
parent.versionRequirementTable else MutableVersionRequirementTable(),
serializeTypeTableToFunction = false,
plugins.toList()
plugins
)
for (typeParameter in descriptor.declaredTypeParameters) {
serializer.typeParameters.intern(typeParameter)
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.serialization
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable
@@ -18,4 +19,7 @@ interface DescriptorSerializerPlugin {
extension: SerializerExtension
) {
}
companion object : ProjectExtensionDescriptor<DescriptorSerializerPlugin>(
"org.jetbrains.kotlin.DescriptorSerializerPlugin", DescriptorSerializerPlugin::class.java)
}