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:
+9
-5
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.serialization.js
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import org.jetbrains.kotlin.config.AnalysisFlags
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
@@ -61,10 +62,11 @@ object KotlinJavascriptSerializationUtil {
|
||||
bindingContext: BindingContext,
|
||||
jsDescriptor: JsModuleDescriptor<ModuleDescriptor>,
|
||||
languageVersionSettings: LanguageVersionSettings,
|
||||
metadataVersion: JsMetadataVersion
|
||||
metadataVersion: JsMetadataVersion,
|
||||
project: Project
|
||||
): SerializedMetadata {
|
||||
val serializedFragments =
|
||||
emptyMap<FqName, ByteArray>().missingMetadata(bindingContext, jsDescriptor.data, languageVersionSettings, metadataVersion)
|
||||
emptyMap<FqName, ByteArray>().missingMetadata(bindingContext, jsDescriptor.data, languageVersionSettings, metadataVersion, project)
|
||||
|
||||
return SerializedMetadata(serializedFragments, jsDescriptor, languageVersionSettings, metadataVersion)
|
||||
}
|
||||
@@ -160,6 +162,7 @@ object KotlinJavascriptSerializationUtil {
|
||||
scope: Collection<DeclarationDescriptor>,
|
||||
fqName: FqName,
|
||||
languageVersionSettings: LanguageVersionSettings,
|
||||
project: Project,
|
||||
metadataVersion: BinaryVersion
|
||||
): ProtoBuf.PackageFragment {
|
||||
val builder = ProtoBuf.PackageFragment.newBuilder()
|
||||
@@ -184,7 +187,7 @@ object KotlinJavascriptSerializationUtil {
|
||||
for (descriptor in descriptors) {
|
||||
if (descriptor !is ClassDescriptor || skip(descriptor)) continue
|
||||
|
||||
val serializer = DescriptorSerializer.create(descriptor, extension, parentSerializer)
|
||||
val serializer = DescriptorSerializer.create(descriptor, extension, parentSerializer, project)
|
||||
serializeClasses(descriptor.unsubstitutedInnerClassesScope.getContributedDescriptors(), serializer)
|
||||
val classProto = serializer.classProto(descriptor).build() ?: error("Class not serialized: $descriptor")
|
||||
builder.addClass_(classProto)
|
||||
@@ -305,7 +308,8 @@ fun Map<FqName, ByteArray>.missingMetadata(
|
||||
bindingContext: BindingContext,
|
||||
moduleDescriptor: ModuleDescriptor,
|
||||
languageVersionSettings: LanguageVersionSettings,
|
||||
metadataVersion: JsMetadataVersion
|
||||
metadataVersion: JsMetadataVersion,
|
||||
project: Project
|
||||
): Map<FqName, ByteArray> {
|
||||
val serializedFragments = HashMap<FqName, ByteArray>()
|
||||
|
||||
@@ -317,7 +321,7 @@ fun Map<FqName, ByteArray>.missingMetadata(
|
||||
moduleDescriptor.packageFragmentProviderForModuleContentWithoutDependencies.packageFragments(fqName).flatMap {
|
||||
it.getMemberScope().getContributedDescriptors()
|
||||
},
|
||||
fqName, languageVersionSettings, metadataVersion
|
||||
fqName, languageVersionSettings, project, metadataVersion
|
||||
)
|
||||
|
||||
if (!fragment.isEmpty()) {
|
||||
|
||||
@@ -475,6 +475,7 @@ class GenerateIrRuntime {
|
||||
val tmpKlibDir = createTempDir().also { it.deleteOnExit() }
|
||||
serializeModuleIntoKlib(
|
||||
moduleName,
|
||||
project,
|
||||
configuration,
|
||||
bindingContext,
|
||||
files,
|
||||
|
||||
@@ -18,44 +18,44 @@ package org.jetbrains.kotlin.js.facade
|
||||
|
||||
import com.intellij.openapi.vfs.VfsUtilCore
|
||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||
import org.jetbrains.kotlin.config.*
|
||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils.hasError
|
||||
import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS
|
||||
import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult
|
||||
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
|
||||
import org.jetbrains.kotlin.js.config.JsConfig
|
||||
import org.jetbrains.kotlin.js.facade.exceptions.TranslationException
|
||||
import org.jetbrains.kotlin.js.inline.JsInliner
|
||||
import org.jetbrains.kotlin.js.inline.clean.*
|
||||
import org.jetbrains.kotlin.js.sourceMap.SourceFilePathResolver
|
||||
import org.jetbrains.kotlin.js.translate.general.Translation
|
||||
import org.jetbrains.kotlin.js.translate.utils.*
|
||||
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil
|
||||
import org.jetbrains.kotlin.serialization.js.ast.JsAstSerializer
|
||||
import org.jetbrains.kotlin.utils.JsMetadataVersion
|
||||
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.io.IOException
|
||||
import java.util.ArrayList
|
||||
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils.hasError
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsBlock
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsName
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsProgramFragment
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsStatement
|
||||
import org.jetbrains.kotlin.js.config.ErrorTolerancePolicy
|
||||
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
|
||||
import org.jetbrains.kotlin.js.config.JsConfig
|
||||
import org.jetbrains.kotlin.js.coroutine.transformCoroutines
|
||||
import org.jetbrains.kotlin.js.facade.exceptions.TranslationException
|
||||
import org.jetbrains.kotlin.js.inline.JsInliner
|
||||
import org.jetbrains.kotlin.js.inline.clean.resolveTemporaryNames
|
||||
import org.jetbrains.kotlin.js.inline.clean.transformLabeledBlockToDoWhile
|
||||
import org.jetbrains.kotlin.js.inline.util.collectDefinedNamesInAllScopes
|
||||
import org.jetbrains.kotlin.js.sourceMap.SourceFilePathResolver
|
||||
import org.jetbrains.kotlin.js.translate.general.SourceFileTranslationResult
|
||||
import org.jetbrains.kotlin.js.translate.general.Translation
|
||||
import org.jetbrains.kotlin.js.translate.utils.BindingUtils
|
||||
import org.jetbrains.kotlin.js.translate.utils.expandIsCalls
|
||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.BindingTrace
|
||||
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil
|
||||
import org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.js.ast.JsAstSerializer
|
||||
import org.jetbrains.kotlin.serialization.js.missingMetadata
|
||||
import org.jetbrains.kotlin.utils.JsMetadataVersion
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.io.IOException
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* An entry point of translator.
|
||||
@@ -221,7 +221,8 @@ class K2JSTranslator @JvmOverloads constructor(
|
||||
bindingContext,
|
||||
moduleDescriptor,
|
||||
config.configuration.languageVersionSettings,
|
||||
config.configuration.get(CommonConfigurationKeys.METADATA_VERSION) as? JsMetadataVersion ?: JsMetadataVersion.INSTANCE
|
||||
config.configuration.get(CommonConfigurationKeys.METADATA_VERSION) as? JsMetadataVersion ?: JsMetadataVersion.INSTANCE,
|
||||
config.project
|
||||
)
|
||||
|
||||
for ((packageName, metadata) in additionalMetadata) {
|
||||
@@ -248,6 +249,7 @@ class K2JSTranslator @JvmOverloads constructor(
|
||||
scope,
|
||||
packageName,
|
||||
config.configuration.languageVersionSettings,
|
||||
config.project,
|
||||
metadataVersion ?: JsMetadataVersion.INSTANCE
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user