[FIR2IR] Use single IrBuiltInsOverFir for all MPP source modules

^KT-56229 Fixed
This commit is contained in:
Ivan Kochurkin
2023-01-26 21:20:34 +01:00
committed by Space Team
parent 001b11f285
commit e601b01be2
13 changed files with 71 additions and 23 deletions
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.AbstractFirAnalyzerFacade
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions
import org.jetbrains.kotlin.fir.backend.Fir2IrResult import org.jetbrains.kotlin.fir.backend.Fir2IrResult
import org.jetbrains.kotlin.fir.backend.IrBuiltInsOverFir
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
@@ -43,7 +44,8 @@ class LowLevelFirAnalyzerFacade(
fir2IrExtensions: Fir2IrExtensions, fir2IrExtensions: Fir2IrExtensions,
signatureComposer: FirBasedSignatureComposer, signatureComposer: FirBasedSignatureComposer,
symbolTable: SymbolTable, symbolTable: SymbolTable,
dependentComponents: List<Fir2IrComponents> dependentComponents: List<Fir2IrComponents>,
irBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult = shouldNotBeCalled() ): Fir2IrResult = shouldNotBeCalled()
} }
@@ -600,7 +600,8 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
kotlinBuiltIns = builtInsModule ?: DefaultBuiltIns.Instance, // TODO: consider passing externally kotlinBuiltIns = builtInsModule ?: DefaultBuiltIns.Instance, // TODO: consider passing externally
signatureComposer = signatureComposer, signatureComposer = signatureComposer,
symbolTable = symbolTable, symbolTable = symbolTable,
dependentComponents = emptyList() dependentComponents = emptyList(),
initializedIrBuiltIns = null
).also { ).also {
(it.irModuleFragment.descriptor as? FirModuleDescriptor)?.let { it.allDependencyModules = librariesDescriptors } (it.irModuleFragment.descriptor as? FirModuleDescriptor)?.let { it.allDependencyModules = librariesDescriptors }
} }
@@ -10,10 +10,7 @@ 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.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.backend.Fir2IrConverter
import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions
import org.jetbrains.kotlin.fir.backend.Fir2IrResult
import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter
@@ -57,7 +54,8 @@ fun FirResult.convertToIrAndActualize(
linkViaSignatures = linkViaSignatures, linkViaSignatures = linkViaSignatures,
signatureComposer = signatureComposer, signatureComposer = signatureComposer,
symbolTable = symbolTable, symbolTable = symbolTable,
dependentComponents = emptyList() dependentComponents = emptyList(),
irBuiltIns = null
) )
result = platformOutput.convertToIr( result = platformOutput.convertToIr(
fir2IrExtensions, fir2IrExtensions,
@@ -65,7 +63,8 @@ fun FirResult.convertToIrAndActualize(
linkViaSignatures = linkViaSignatures, linkViaSignatures = linkViaSignatures,
signatureComposer = signatureComposer, signatureComposer = signatureComposer,
symbolTable = symbolTable, symbolTable = symbolTable,
dependentComponents = listOf(commonIrOutput.components) dependentComponents = listOf(commonIrOutput.components),
irBuiltIns = commonIrOutput.components.irBuiltIns
) )
IrActualizer.actualize( IrActualizer.actualize(
result.irModuleFragment, result.irModuleFragment,
@@ -78,7 +77,8 @@ fun FirResult.convertToIrAndActualize(
linkViaSignatures = linkViaSignatures, linkViaSignatures = linkViaSignatures,
signatureComposer = signatureComposer, signatureComposer = signatureComposer,
symbolTable = symbolTable, symbolTable = symbolTable,
dependentComponents = emptyList() dependentComponents = emptyList(),
irBuiltIns = null
) )
} }
@@ -91,7 +91,8 @@ private fun ModuleCompilerAnalyzedOutput.convertToIr(
linkViaSignatures: Boolean, linkViaSignatures: Boolean,
signatureComposer: FirBasedSignatureComposer, signatureComposer: FirBasedSignatureComposer,
symbolTable: SymbolTable, symbolTable: SymbolTable,
dependentComponents: List<Fir2IrComponents> dependentComponents: List<Fir2IrComponents>,
irBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult { ): Fir2IrResult {
return Fir2IrConverter.createModuleFragmentWithSignaturesIfNeeded( return Fir2IrConverter.createModuleFragmentWithSignaturesIfNeeded(
session, scopeSession, fir, session, scopeSession, fir,
@@ -103,6 +104,7 @@ private fun ModuleCompilerAnalyzedOutput.convertToIr(
generateSignatures = linkViaSignatures, generateSignatures = linkViaSignatures,
signatureComposer = signatureComposer, signatureComposer = signatureComposer,
symbolTable = symbolTable, symbolTable = symbolTable,
dependentComponents = dependentComponents dependentComponents = dependentComponents,
initializedIrBuiltIns = irBuiltIns
) )
} }
@@ -79,9 +79,6 @@ class Fir2IrClassifierStorage(
with(typeConverter) { toIrType(typeContext) } with(typeConverter) { toIrType(typeContext) }
fun preCacheBuiltinClasses() { fun preCacheBuiltinClasses() {
// dependentStorages are only actual for MPP scenario
// There is no need to precache them twice: the same library session is used and FIR and IR elements are the same
if (dependentStorages.isNotEmpty()) return
for ((classId, irBuiltinSymbol) in typeConverter.classIdToSymbolMap) { for ((classId, irBuiltinSymbol) in typeConverter.classIdToSymbolMap) {
val firClass = ConeClassLikeLookupTagImpl(classId).toSymbol(session)!!.fir as FirRegularClass val firClass = ConeClassLikeLookupTagImpl(classId).toSymbol(session)!!.fir as FirRegularClass
val irClass = irBuiltinSymbol.owner val irClass = irBuiltinSymbol.owner
@@ -61,12 +61,15 @@ class Fir2IrConverter(
irGenerationExtensions: Collection<IrGenerationExtension>, irGenerationExtensions: Collection<IrGenerationExtension>,
fir2irVisitor: Fir2IrVisitor, fir2irVisitor: Fir2IrVisitor,
fir2IrExtensions: Fir2IrExtensions, fir2IrExtensions: Fir2IrExtensions,
runPreCacheBuiltinClasses: Boolean
) { ) {
session.lazyDeclarationResolver.disableLazyResolveContractChecks() session.lazyDeclarationResolver.disableLazyResolveContractChecks()
for (firFile in allFirFiles) { for (firFile in allFirFiles) {
registerFileAndClasses(firFile, irModuleFragment) registerFileAndClasses(firFile, irModuleFragment)
} }
classifierStorage.preCacheBuiltinClasses() if (runPreCacheBuiltinClasses) {
classifierStorage.preCacheBuiltinClasses()
}
// The file processing is performed phase-to-phase: // The file processing is performed phase-to-phase:
// 1. Creation of all non-local regular classes // 1. Creation of all non-local regular classes
// 2. Class header processing (type parameters, supertypes, this receiver) // 2. Class header processing (type parameters, supertypes, this receiver)
@@ -459,7 +462,8 @@ class Fir2IrConverter(
kotlinBuiltIns: KotlinBuiltIns, kotlinBuiltIns: KotlinBuiltIns,
signatureComposer: FirBasedSignatureComposer, signatureComposer: FirBasedSignatureComposer,
symbolTable: SymbolTable, symbolTable: SymbolTable,
dependentComponents: List<Fir2IrComponents> dependentComponents: List<Fir2IrComponents>,
initializedIrBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult { ): Fir2IrResult {
val moduleDescriptor = FirModuleDescriptor(session, kotlinBuiltIns) val moduleDescriptor = FirModuleDescriptor(session, kotlinBuiltIns)
val components = Fir2IrComponentsStorage( val components = Fir2IrComponentsStorage(
@@ -477,7 +481,7 @@ class Fir2IrConverter(
components.visibilityConverter = visibilityConverter components.visibilityConverter = visibilityConverter
val typeConverter = Fir2IrTypeConverter(components) val typeConverter = Fir2IrTypeConverter(components)
components.typeConverter = typeConverter components.typeConverter = typeConverter
val irBuiltIns = dependentComponents.lastOrNull()?.irBuiltIns ?: IrBuiltInsOverFir( val irBuiltIns = initializedIrBuiltIns ?: IrBuiltInsOverFir(
components, languageVersionSettings, moduleDescriptor, irMangler, components, languageVersionSettings, moduleDescriptor, irMangler,
languageVersionSettings.getFlag(AnalysisFlags.builtInsFromSources) || kotlinBuiltIns !== DefaultBuiltIns.Instance languageVersionSettings.getFlag(AnalysisFlags.builtInsFromSources) || kotlinBuiltIns !== DefaultBuiltIns.Instance
) )
@@ -505,7 +509,8 @@ class Fir2IrConverter(
} }
converter.runSourcesConversion( converter.runSourcesConversion(
allFirFiles, irModuleFragment, irGenerationExtensions, fir2irVisitor, fir2IrExtensions allFirFiles, irModuleFragment, irGenerationExtensions, fir2irVisitor, fir2IrExtensions,
runPreCacheBuiltinClasses = initializedIrBuiltIns == null
) )
return Fir2IrResult(irModuleFragment, components, moduleDescriptor) return Fir2IrResult(irModuleFragment, components, moduleDescriptor)
@@ -33082,6 +33082,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/multiplatform/multiModule/getRidOfDoubleBindingInFir2IrLazyProperty.kt"); runTest("compiler/testData/codegen/box/multiplatform/multiModule/getRidOfDoubleBindingInFir2IrLazyProperty.kt");
} }
@Test
@TestMetadata("independentCommonSourceModules.kt")
public void testIndependentCommonSourceModules() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/multiModule/independentCommonSourceModules.kt");
}
@Test @Test
@TestMetadata("kt-51753-1.kt") @TestMetadata("kt-51753-1.kt")
public void testKt_51753_1() throws Exception { public void testKt_51753_1() throws Exception {
@@ -0,0 +1,20 @@
// TARGET_BACKEND: JVM_IR
// !LANGUAGE: +MultiPlatformProjects
// MODULE: common1
// TARGET_PLATFORM: Common
// FILE: common1.kt
fun o() = "O"
// MODULE: common2
// TARGET_PLATFORM: Common
// FILE: common2.kt
fun k() = "K"
// MODULE: jvm()()(common1, common2)
// TARGET_PLATFORM: JVM
// FILE: main.kt
fun box() = o() + k()
@@ -33082,6 +33082,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/multiplatform/multiModule/getRidOfDoubleBindingInFir2IrLazyProperty.kt"); runTest("compiler/testData/codegen/box/multiplatform/multiModule/getRidOfDoubleBindingInFir2IrLazyProperty.kt");
} }
@Test
@TestMetadata("independentCommonSourceModules.kt")
public void testIndependentCommonSourceModules() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/multiModule/independentCommonSourceModules.kt");
}
@Test @Test
@TestMetadata("kt-51753-1.kt") @TestMetadata("kt-51753-1.kt")
public void testKt_51753_1() throws Exception { public void testKt_51753_1() throws Exception {
@@ -136,7 +136,8 @@ fun AbstractFirAnalyzerFacade.convertToJsIr(
kotlinBuiltIns = builtIns ?: DefaultBuiltIns.Instance, // TODO: consider passing externally, kotlinBuiltIns = builtIns ?: DefaultBuiltIns.Instance, // TODO: consider passing externally,
signatureComposer = signatureComposer, signatureComposer = signatureComposer,
symbolTable = symbolTable, symbolTable = symbolTable,
dependentComponents = emptyList() dependentComponents = emptyList(),
initializedIrBuiltIns = null
).also { ).also {
(it.irModuleFragment.descriptor as? FirModuleDescriptor)?.let { it.allDependencyModules = dependencies } (it.irModuleFragment.descriptor as? FirModuleDescriptor)?.let { it.allDependencyModules = dependencies }
} }
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.fir.FirAnalyzerFacade import org.jetbrains.kotlin.fir.FirAnalyzerFacade
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.Fir2IrConverter import org.jetbrains.kotlin.fir.backend.Fir2IrConverter
import org.jetbrains.kotlin.fir.backend.IrBuiltInsOverFir
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
@@ -80,6 +81,7 @@ class Fir2IrResultsConverter(
signatureComposerCreator = { JvmIdSignatureDescriptor(JvmDescriptorMangler(null)) }, signatureComposerCreator = { JvmIdSignatureDescriptor(JvmDescriptorMangler(null)) },
manglerCreator = { FirJvmKotlinMangler() } manglerCreator = { FirJvmKotlinMangler() }
) )
var irBuiltIns: IrBuiltInsOverFir? = null
for ((index, firOutputPart) in inputArtifact.partsForDependsOnModules.withIndex()) { for ((index, firOutputPart) in inputArtifact.partsForDependsOnModules.withIndex()) {
val dependentComponents = mutableListOf<Fir2IrComponents>() val dependentComponents = mutableListOf<Fir2IrComponents>()
@@ -93,6 +95,7 @@ class Fir2IrResultsConverter(
fir2IrExtensions, signatureComposer, symbolTable, dependentComponents, irBuiltIns fir2IrExtensions, signatureComposer, symbolTable, dependentComponents, irBuiltIns
) )
componentsMap[firOutputPart.module.name] = components componentsMap[firOutputPart.module.name] = components
irBuiltIns = components.irBuiltIns
val irPart = JvmIrCodegenFactory.JvmIrBackendInput( val irPart = JvmIrCodegenFactory.JvmIrBackendInput(
irModuleFragment, irModuleFragment,
@@ -139,6 +139,7 @@ object GenerationUtils {
signatureComposer = signatureComposer, signatureComposer = signatureComposer,
symbolTable = symbolTable, symbolTable = symbolTable,
dependentComponents = emptyList(), dependentComponents = emptyList(),
irBuiltIns = null
) )
val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext
@@ -38,7 +38,8 @@ abstract class AbstractFirAnalyzerFacade {
fir2IrExtensions: Fir2IrExtensions, fir2IrExtensions: Fir2IrExtensions,
signatureComposer: FirBasedSignatureComposer, signatureComposer: FirBasedSignatureComposer,
symbolTable: SymbolTable, symbolTable: SymbolTable,
dependentComponents: List<Fir2IrComponents> dependentComponents: List<Fir2IrComponents>,
irBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult ): Fir2IrResult
} }
@@ -108,7 +109,8 @@ class FirAnalyzerFacade(
fir2IrExtensions: Fir2IrExtensions, fir2IrExtensions: Fir2IrExtensions,
signatureComposer: FirBasedSignatureComposer, signatureComposer: FirBasedSignatureComposer,
symbolTable: SymbolTable, symbolTable: SymbolTable,
dependentComponents: List<Fir2IrComponents> dependentComponents: List<Fir2IrComponents>,
irBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult { ): Fir2IrResult {
if (_scopeSession == null) runResolution() if (_scopeSession == null) runResolution()
@@ -124,7 +126,8 @@ class FirAnalyzerFacade(
kotlinBuiltIns = DefaultBuiltIns.Instance, // TODO: consider passing externally, kotlinBuiltIns = DefaultBuiltIns.Instance, // TODO: consider passing externally,
signatureComposer = signatureComposer, signatureComposer = signatureComposer,
symbolTable = symbolTable, symbolTable = symbolTable,
dependentComponents = dependentComponents dependentComponents = dependentComponents,
initializedIrBuiltIns = irBuiltIns
) )
} }
} }
@@ -89,7 +89,8 @@ internal fun PhaseContext.fir2Ir(
kotlinBuiltIns = builtInsModule ?: DefaultBuiltIns.Instance, // TODO: consider passing externally kotlinBuiltIns = builtInsModule ?: DefaultBuiltIns.Instance, // TODO: consider passing externally
signatureComposer = signatureComposer, signatureComposer = signatureComposer,
symbolTable = symbolTable, symbolTable = symbolTable,
dependentComponents = emptyList() dependentComponents = emptyList(),
initializedIrBuiltIns = null
).also { ).also {
(it.irModuleFragment.descriptor as? FirModuleDescriptor)?.let { it.allDependencyModules = librariesDescriptors } (it.irModuleFragment.descriptor as? FirModuleDescriptor)?.let { it.allDependencyModules = librariesDescriptors }
} }