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:
@@ -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 {
|
||||
|
||||
+6
-10
@@ -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)
|
||||
|
||||
+4
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user