From 0741250b12fbe65d63368786ba4b393b199615bd Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 16 Jan 2024 18:39:33 +0200 Subject: [PATCH] [FIR] Use proper FirProvider in the FirKLibSerializerExtension 3aa84906 changed native metadata serialization to use proper platform session, but it caused a new bug: FirKLibSerializerExtension uses FirProvider from the passed session to get a containing file of serialized declaration to put some extension into the metadata. And platform session doesn't contain information about any declarations except platform ones So it's needed to use the proper FirProvider in it, which can be extracted from Fir2IrComponents. This provider contains providers from all sessions that are being compiled plus providers for top-level declarations generated by compiler plugins ^KT-65024 Fixed --- .../kotlin/cli/js/klib/compilerPipeline.kt | 16 ++++++++-------- .../kotlin/cli/metadata/FirMetadataSerializer.kt | 3 ++- .../serialization/FirKLibSerializerExtension.kt | 5 ++--- .../frontend/fir/Fir2IrJsWasmResultsConverter.kt | 2 +- .../kotlin/backend/konan/FirNativeSerializer.kt | 4 +++- 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/klib/compilerPipeline.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/klib/compilerPipeline.kt index a0e027ac2df..89cbedbd9b3 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/klib/compilerPipeline.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/klib/compilerPipeline.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.languageVersionSettings -import org.jetbrains.kotlin.constant.EvaluatedConstTracker import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.diagnostics.impl.PendingDiagnosticsCollectorWithSuppress @@ -263,7 +262,7 @@ private class Fir2KlibSerializer( private val firFilesAndSessionsBySourceFile = buildMap { for (output in firOutputs) { output.fir.forEach { - put(it.sourceFile!!, Triple(it, output.session, output.scopeSession)) + put(it.sourceFile!!, it) } } } @@ -279,19 +278,20 @@ private class Fir2KlibSerializer( val sourceFiles: List = firFilesAndSessionsBySourceFile.keys.toList() fun serializeSingleFirFile(file: KtSourceFile): ProtoBuf.PackageFragment { - val (firFile, session, scopeSession) = firFilesAndSessionsBySourceFile[file] + val firFile = firFilesAndSessionsBySourceFile[file] ?: error("cannot find FIR file by source file ${file.name} (${file.path})") + val components = fir2IrActualizedResult.components return serializeSingleFirFile( firFile, - session, - scopeSession, + components.session, + components.scopeSession, actualizedExpectDeclarations, FirKLibSerializerExtension( - session, metadataVersion, - ConstValueProviderImpl(fir2IrActualizedResult.components), + components.session, components.firProvider, metadataVersion, + ConstValueProviderImpl(components), allowErrorTypes = false, exportKDoc = false, - fir2IrActualizedResult.components.annotationsFromPluginRegistrar.createAdditionalMetadataProvider() + components.annotationsFromPluginRegistrar.createAdditionalMetadataProvider() ), languageVersionSettings, ) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt index f1124d479b1..8f61965694c 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.fir.pipeline.ModuleCompilerAnalyzedOutput import org.jetbrains.kotlin.fir.pipeline.buildFirFromKtFiles import org.jetbrains.kotlin.fir.pipeline.buildFirViaLightTree import org.jetbrains.kotlin.fir.pipeline.resolveAndCheckFir +import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.serialization.FirKLibSerializerExtension import org.jetbrains.kotlin.fir.serialization.serializeSingleFirFile import org.jetbrains.kotlin.library.SerializedMetadata @@ -173,7 +174,7 @@ internal class FirMetadataSerializer( scopeSession, actualizedExpectDeclarations = null, FirKLibSerializerExtension( - session, metadataVersion, constValueProvider = null, + session, session.firProvider, metadataVersion, constValueProvider = null, allowErrorTypes = false, exportKDoc = false, additionalMetadataProvider = null ), diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirKLibSerializerExtension.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirKLibSerializerExtension.kt index efcb41e785c..e82151c7db0 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirKLibSerializerExtension.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirKLibSerializerExtension.kt @@ -9,7 +9,7 @@ import com.intellij.lang.LighterASTNode import com.intellij.openapi.util.Ref import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.resolve.providers.firProvider +import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.serialization.constant.ConstValueProvider import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.serialization.deserialization.DYNAMIC_TYPE_DESERIALI class FirKLibSerializerExtension( override val session: FirSession, + private val firProvider: FirProvider, override val metadataVersion: BinaryVersion, override val constValueProvider: ConstValueProvider?, private val allowErrorTypes: Boolean, @@ -85,8 +86,6 @@ class FirKLibSerializerExtension( super.serializeFunction(function, proto, versionRequirementTable, childSerializer) } - private val firProvider = session.firProvider - @Suppress("Reformat") private fun < MessageType : GeneratedMessageLite.ExtendableMessage, diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsWasmResultsConverter.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsWasmResultsConverter.kt index 9ccec605a75..4cc76b40af9 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsWasmResultsConverter.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsWasmResultsConverter.kt @@ -96,7 +96,7 @@ abstract class Fir2IrJsWasmResultsConverter(testServices: TestServices) : Abstra components.scopeSession, actualizedExpectDeclarations, FirKLibSerializerExtension( - components.session, metadataVersion, + components.session, components.firProvider, metadataVersion, ConstValueProviderImpl(components), allowErrorTypes = false, exportKDoc = false, components.annotationsFromPluginRegistrar.createAdditionalMetadataProvider() diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirNativeSerializer.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirNativeSerializer.kt index 5d87acc9bbf..3340e5da8ad 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirNativeSerializer.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirNativeSerializer.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.packageFqName import org.jetbrains.kotlin.fir.pipeline.FirResult import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.serialization.* import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.util.IrMessageLogger @@ -87,13 +88,14 @@ internal fun PhaseContext.firSerializerBase( ) { firFile, originalSession, originalScopeSession -> val session = fir2IrOutput?.components?.session ?: originalSession val scopeSession = fir2IrOutput?.components?.scopeSession ?: originalScopeSession + val firProvider = fir2IrOutput?.components?.firProvider ?: originalSession.firProvider serializeSingleFirFile( firFile, session, scopeSession, actualizedFirDeclarations, FirKLibSerializerExtension( - session, metadataVersion, + session, firProvider, metadataVersion, fir2IrOutput?.let { ConstValueProviderImpl(fir2IrOutput.components) },