[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()
val fir2IrExtensions = JvmFir2IrExtensions(moduleConfiguration, JvmIrDeserializerImpl(), JvmIrMangler)
val fir2IrResult = firResult.convertToIrAndActualize(
val fir2IrResult = firResult.convertToIrAndActualizeForJvm(
fir2IrExtensions,
irGenerationExtensions,
linkViaSignatures = moduleConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES)
@@ -221,7 +221,7 @@ fun convertAnalyzedFirToIr(
} ?: emptyList()
val linkViaSignatures = input.configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES)
val (irModuleFragment, components, pluginContext) =
analysisResults.convertToIrAndActualize(extensions, irGenerationExtensions, linkViaSignatures)
analysisResults.convertToIrAndActualizeForJvm(extensions, irGenerationExtensions, linkViaSignatures)
return ModuleCompilerIrBackendInput(
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.jvm.serialization.JvmIdSignatureDescriptor
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.*
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.JvmIrMangler
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(
val platformOutput: ModuleCompilerAnalyzedOutput,
@@ -32,17 +35,35 @@ data class ModuleCompilerAnalyzedOutput(
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(
fir2IrExtensions: Fir2IrExtensions,
irGeneratorExtensions: Collection<IrGenerationExtension>,
linkViaSignatures: Boolean,
signatureComposerCreator: (() -> IdSignatureComposer)?,
irMangler: KotlinMangler.IrMangler,
visibilityConverter: Fir2IrVisibilityConverter,
kotlinBuiltIns: KotlinBuiltIns,
): Fir2IrResult {
val result: Fir2IrResult
val commonMemberStorage = Fir2IrCommonMemberStorage(
generateSignatures = linkViaSignatures,
signatureComposerCreator = { JvmIdSignatureDescriptor(JvmDescriptorMangler(null)) },
manglerCreator = { FirJvmKotlinMangler() }
signatureComposerCreator = signatureComposerCreator,
manglerCreator = { FirJvmKotlinMangler() } // TODO: replace with potentially simpler version for other backends.
)
if (commonOutput != null) {
@@ -51,14 +72,20 @@ fun FirResult.convertToIrAndActualize(
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage,
irBuiltIns = null
irBuiltIns = null,
irMangler,
visibilityConverter,
kotlinBuiltIns,
)
result = platformOutput.convertToIr(
fir2IrExtensions,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage,
irBuiltIns = commonIrOutput.components.irBuiltIns
irBuiltIns = commonIrOutput.components.irBuiltIns,
irMangler,
visibilityConverter,
kotlinBuiltIns,
)
IrActualizer.actualize(
result.irModuleFragment,
@@ -70,7 +97,10 @@ fun FirResult.convertToIrAndActualize(
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage,
irBuiltIns = null
irBuiltIns = null,
irMangler,
visibilityConverter,
kotlinBuiltIns,
)
}
@@ -82,15 +112,18 @@ private fun ModuleCompilerAnalyzedOutput.convertToIr(
irGeneratorExtensions: Collection<IrGenerationExtension>,
linkViaSignatures: Boolean,
commonMemberStorage: Fir2IrCommonMemberStorage,
irBuiltIns: IrBuiltInsOverFir?
irBuiltIns: IrBuiltInsOverFir?,
irMangler: KotlinMangler.IrMangler,
visibilityConverter: Fir2IrVisibilityConverter,
kotlinBuiltIns: KotlinBuiltIns,
): Fir2IrResult {
return Fir2IrConverter.createModuleFragmentWithSignaturesIfNeeded(
session, scopeSession, fir,
session.languageVersionSettings, fir2IrExtensions,
JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter,
Fir2IrJvmSpecialAnnotationSymbolProvider(),
irMangler, IrFactoryImpl, visibilityConverter,
Fir2IrJvmSpecialAnnotationSymbolProvider(), // TODO: replace with appropriate (probably empty) implementation for other backends.
irGeneratorExtensions,
kotlinBuiltIns = DefaultBuiltIns.Instance, // TODO: consider passing externally
kotlinBuiltIns = kotlinBuiltIns,
generateSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage,
initializedIrBuiltIns = irBuiltIns
@@ -50,7 +50,7 @@ import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.pipeline.FirResult
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.impl.FirProviderImpl
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
@@ -275,7 +275,7 @@ class IncrementalFirJvmCompilerRunner(
val extensions = JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), JvmIrMangler)
val irGenerationExtensions =
(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()