[FIR2IR] Make convertToIrAndActualize() more reusable across backends

This commit is contained in:
Svyatoslav Scherbina
2023-02-02 13:01:12 +01:00
committed by Space Team
parent 199b0e8cbe
commit cf4934f539
4 changed files with 46 additions and 13 deletions
@@ -159,7 +159,7 @@ object FirKotlinToJvmBytecodeCompiler {
performanceManager?.notifyIRTranslationStarted() performanceManager?.notifyIRTranslationStarted()
val fir2IrExtensions = JvmFir2IrExtensions(moduleConfiguration, JvmIrDeserializerImpl(), JvmIrMangler) val fir2IrExtensions = JvmFir2IrExtensions(moduleConfiguration, JvmIrDeserializerImpl(), JvmIrMangler)
val fir2IrResult = firResult.convertToIrAndActualize( val fir2IrResult = firResult.convertToIrAndActualizeForJvm(
fir2IrExtensions, fir2IrExtensions,
irGenerationExtensions, irGenerationExtensions,
linkViaSignatures = moduleConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES) linkViaSignatures = moduleConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES)
@@ -221,7 +221,7 @@ fun convertAnalyzedFirToIr(
} ?: emptyList() } ?: emptyList()
val linkViaSignatures = input.configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES) val linkViaSignatures = input.configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES)
val (irModuleFragment, components, pluginContext) = val (irModuleFragment, components, pluginContext) =
analysisResults.convertToIrAndActualize(extensions, irGenerationExtensions, linkViaSignatures) analysisResults.convertToIrAndActualizeForJvm(extensions, irGenerationExtensions, linkViaSignatures)
return ModuleCompilerIrBackendInput( return ModuleCompilerIrBackendInput(
input.targetId, input.targetId,
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider
@@ -20,6 +21,8 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.util.IdSignatureComposer
import org.jetbrains.kotlin.ir.util.KotlinMangler
data class FirResult( data class FirResult(
val platformOutput: ModuleCompilerAnalyzedOutput, val platformOutput: ModuleCompilerAnalyzedOutput,
@@ -32,17 +35,35 @@ data class ModuleCompilerAnalyzedOutput(
val fir: List<FirFile> val fir: List<FirFile>
) )
fun FirResult.convertToIrAndActualizeForJvm(
fir2IrExtensions: Fir2IrExtensions,
irGeneratorExtensions: Collection<IrGenerationExtension>,
linkViaSignatures: Boolean,
): Fir2IrResult = this.convertToIrAndActualize(
fir2IrExtensions,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
signatureComposerCreator = { JvmIdSignatureDescriptor(JvmDescriptorMangler(null)) },
irMangler = JvmIrMangler,
visibilityConverter = FirJvmVisibilityConverter,
kotlinBuiltIns = DefaultBuiltIns.Instance,
)
fun FirResult.convertToIrAndActualize( fun FirResult.convertToIrAndActualize(
fir2IrExtensions: Fir2IrExtensions, fir2IrExtensions: Fir2IrExtensions,
irGeneratorExtensions: Collection<IrGenerationExtension>, irGeneratorExtensions: Collection<IrGenerationExtension>,
linkViaSignatures: Boolean, linkViaSignatures: Boolean,
signatureComposerCreator: (() -> IdSignatureComposer)?,
irMangler: KotlinMangler.IrMangler,
visibilityConverter: Fir2IrVisibilityConverter,
kotlinBuiltIns: KotlinBuiltIns,
): Fir2IrResult { ): Fir2IrResult {
val result: Fir2IrResult val result: Fir2IrResult
val commonMemberStorage = Fir2IrCommonMemberStorage( val commonMemberStorage = Fir2IrCommonMemberStorage(
generateSignatures = linkViaSignatures, generateSignatures = linkViaSignatures,
signatureComposerCreator = { JvmIdSignatureDescriptor(JvmDescriptorMangler(null)) }, signatureComposerCreator = signatureComposerCreator,
manglerCreator = { FirJvmKotlinMangler() } manglerCreator = { FirJvmKotlinMangler() } // TODO: replace with potentially simpler version for other backends.
) )
if (commonOutput != null) { if (commonOutput != null) {
@@ -51,14 +72,20 @@ fun FirResult.convertToIrAndActualize(
irGeneratorExtensions, irGeneratorExtensions,
linkViaSignatures = linkViaSignatures, linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage, commonMemberStorage = commonMemberStorage,
irBuiltIns = null irBuiltIns = null,
irMangler,
visibilityConverter,
kotlinBuiltIns,
) )
result = platformOutput.convertToIr( result = platformOutput.convertToIr(
fir2IrExtensions, fir2IrExtensions,
irGeneratorExtensions, irGeneratorExtensions,
linkViaSignatures = linkViaSignatures, linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage, commonMemberStorage = commonMemberStorage,
irBuiltIns = commonIrOutput.components.irBuiltIns irBuiltIns = commonIrOutput.components.irBuiltIns,
irMangler,
visibilityConverter,
kotlinBuiltIns,
) )
IrActualizer.actualize( IrActualizer.actualize(
result.irModuleFragment, result.irModuleFragment,
@@ -70,7 +97,10 @@ fun FirResult.convertToIrAndActualize(
irGeneratorExtensions, irGeneratorExtensions,
linkViaSignatures = linkViaSignatures, linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage, commonMemberStorage = commonMemberStorage,
irBuiltIns = null irBuiltIns = null,
irMangler,
visibilityConverter,
kotlinBuiltIns,
) )
} }
@@ -82,15 +112,18 @@ private fun ModuleCompilerAnalyzedOutput.convertToIr(
irGeneratorExtensions: Collection<IrGenerationExtension>, irGeneratorExtensions: Collection<IrGenerationExtension>,
linkViaSignatures: Boolean, linkViaSignatures: Boolean,
commonMemberStorage: Fir2IrCommonMemberStorage, commonMemberStorage: Fir2IrCommonMemberStorage,
irBuiltIns: IrBuiltInsOverFir? irBuiltIns: IrBuiltInsOverFir?,
irMangler: KotlinMangler.IrMangler,
visibilityConverter: Fir2IrVisibilityConverter,
kotlinBuiltIns: KotlinBuiltIns,
): Fir2IrResult { ): Fir2IrResult {
return Fir2IrConverter.createModuleFragmentWithSignaturesIfNeeded( return Fir2IrConverter.createModuleFragmentWithSignaturesIfNeeded(
session, scopeSession, fir, session, scopeSession, fir,
session.languageVersionSettings, fir2IrExtensions, session.languageVersionSettings, fir2IrExtensions,
JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter, irMangler, IrFactoryImpl, visibilityConverter,
Fir2IrJvmSpecialAnnotationSymbolProvider(), Fir2IrJvmSpecialAnnotationSymbolProvider(), // TODO: replace with appropriate (probably empty) implementation for other backends.
irGeneratorExtensions, irGeneratorExtensions,
kotlinBuiltIns = DefaultBuiltIns.Instance, // TODO: consider passing externally kotlinBuiltIns = kotlinBuiltIns,
generateSignatures = linkViaSignatures, generateSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage, commonMemberStorage = commonMemberStorage,
initializedIrBuiltIns = irBuiltIns initializedIrBuiltIns = irBuiltIns
@@ -50,7 +50,7 @@ import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.pipeline.FirResult import org.jetbrains.kotlin.fir.pipeline.FirResult
import org.jetbrains.kotlin.fir.pipeline.ModuleCompilerAnalyzedOutput import org.jetbrains.kotlin.fir.pipeline.ModuleCompilerAnalyzedOutput
import org.jetbrains.kotlin.fir.pipeline.convertToIrAndActualize import org.jetbrains.kotlin.fir.pipeline.convertToIrAndActualizeForJvm
import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.resolve.providers.firProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
@@ -275,7 +275,7 @@ class IncrementalFirJvmCompilerRunner(
val extensions = JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), JvmIrMangler) val extensions = JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), JvmIrMangler)
val irGenerationExtensions = val irGenerationExtensions =
(projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) }.orEmpty() (projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) }.orEmpty()
val platformIrOutput = cycleResult.convertToIrAndActualize(extensions, irGenerationExtensions, linkViaSignatures = false) val platformIrOutput = cycleResult.convertToIrAndActualizeForJvm(extensions, irGenerationExtensions, linkViaSignatures = false)
performanceManager?.notifyIRTranslationFinished() performanceManager?.notifyIRTranslationFinished()