[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
This commit is contained in:
Dmitriy Novozhilov
2024-01-16 18:39:33 +02:00
committed by Space Team
parent 70d1a2ea8c
commit 0741250b12
5 changed files with 16 additions and 14 deletions
@@ -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<KtSourceFile> = 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,
)
@@ -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
),
@@ -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<MessageType>,
@@ -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()
@@ -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)
},