diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/analysis/FirAnalyzerFacade.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/analysis/FirAnalyzerFacade.kt index e098d1093d7..eb85554d70d 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/analysis/FirAnalyzerFacade.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/analysis/FirAnalyzerFacade.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.analysis import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureDescriptor +import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.analysis.collectors.FirDiagnosticsCollector @@ -83,7 +84,7 @@ class FirAnalyzerFacade( fun convertToIr(extensions: GeneratorExtensions): Fir2IrResult { if (scopeSession == null) runResolution() - val signaturer = IdSignatureDescriptor(JvmManglerDesc()) + val signaturer = JvmIdSignatureDescriptor(JvmManglerDesc()) return Fir2IrConverter.createModuleFragment( session, scopeSession!!, firFiles!!, diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureDescriptor.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureDescriptor.kt index d483cc5a28c..059f80b18bf 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureDescriptor.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/signature/IdSignatureDescriptor.kt @@ -105,15 +105,17 @@ open class IdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMa reportUnexpectedDescriptor(descriptor) } + private val composer by lazy { createSignatureBuilder() } + override fun composeSignature(descriptor: DeclarationDescriptor): IdSignature? { return if (mangler.run { descriptor.isExported() }) { - createSignatureBuilder().buildSignature(descriptor) + composer.buildSignature(descriptor) } else null } override fun composeEnumEntrySignature(descriptor: ClassDescriptor): IdSignature? { return if (mangler.run { descriptor.isExportEnumEntry() }) { - createSignatureBuilder().buildSignature(descriptor) + composer.buildSignature(descriptor) } else null } } \ No newline at end of file diff --git a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/backend/jvm/serialization/JvmIdSignatureDescriptor.kt b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/backend/jvm/serialization/JvmIdSignatureDescriptor.kt index 05372774c96..bad10b5d8e9 100644 --- a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/backend/jvm/serialization/JvmIdSignatureDescriptor.kt +++ b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/backend/jvm/serialization/JvmIdSignatureDescriptor.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.serialization import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureDescriptor import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.KotlinMangler import org.jetbrains.kotlin.load.java.descriptors.JavaForKotlinOverridePropertyDescriptor import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe @@ -95,4 +96,18 @@ class JvmIdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMang } override fun createSignatureBuilder(): DescriptorBasedSignatureBuilder = JvmDescriptorBasedSignatureBuilder(mangler) + + /* In multi-threaded environment, we cannot afford to cache a signature builder, as in IdSignatureBuilder. */ + + override fun composeSignature(descriptor: DeclarationDescriptor): IdSignature? { + return if (mangler.run { descriptor.isExported() }) { + createSignatureBuilder().buildSignature(descriptor) + } else null + } + + override fun composeEnumEntrySignature(descriptor: ClassDescriptor): IdSignature? { + return if (mangler.run { descriptor.isExportEnumEntry() }) { + createSignatureBuilder().buildSignature(descriptor) + } else null + } } \ No newline at end of file