[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.Fir2IrExtensions
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.psi
import org.jetbrains.kotlin.fir.resolve.ScopeSession
@@ -43,7 +44,8 @@ class LowLevelFirAnalyzerFacade(
fir2IrExtensions: Fir2IrExtensions,
signatureComposer: FirBasedSignatureComposer,
symbolTable: SymbolTable,
dependentComponents: List<Fir2IrComponents>
dependentComponents: List<Fir2IrComponents>,
irBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult = shouldNotBeCalled()
}
@@ -600,7 +600,8 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
kotlinBuiltIns = builtInsModule ?: DefaultBuiltIns.Instance, // TODO: consider passing externally
signatureComposer = signatureComposer,
symbolTable = symbolTable,
dependentComponents = emptyList()
dependentComponents = emptyList(),
initializedIrBuiltIns = null
).also {
(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.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
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.*
import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter
@@ -57,7 +54,8 @@ fun FirResult.convertToIrAndActualize(
linkViaSignatures = linkViaSignatures,
signatureComposer = signatureComposer,
symbolTable = symbolTable,
dependentComponents = emptyList()
dependentComponents = emptyList(),
irBuiltIns = null
)
result = platformOutput.convertToIr(
fir2IrExtensions,
@@ -65,7 +63,8 @@ fun FirResult.convertToIrAndActualize(
linkViaSignatures = linkViaSignatures,
signatureComposer = signatureComposer,
symbolTable = symbolTable,
dependentComponents = listOf(commonIrOutput.components)
dependentComponents = listOf(commonIrOutput.components),
irBuiltIns = commonIrOutput.components.irBuiltIns
)
IrActualizer.actualize(
result.irModuleFragment,
@@ -78,7 +77,8 @@ fun FirResult.convertToIrAndActualize(
linkViaSignatures = linkViaSignatures,
signatureComposer = signatureComposer,
symbolTable = symbolTable,
dependentComponents = emptyList()
dependentComponents = emptyList(),
irBuiltIns = null
)
}
@@ -91,7 +91,8 @@ private fun ModuleCompilerAnalyzedOutput.convertToIr(
linkViaSignatures: Boolean,
signatureComposer: FirBasedSignatureComposer,
symbolTable: SymbolTable,
dependentComponents: List<Fir2IrComponents>
dependentComponents: List<Fir2IrComponents>,
irBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult {
return Fir2IrConverter.createModuleFragmentWithSignaturesIfNeeded(
session, scopeSession, fir,
@@ -103,6 +104,7 @@ private fun ModuleCompilerAnalyzedOutput.convertToIr(
generateSignatures = linkViaSignatures,
signatureComposer = signatureComposer,
symbolTable = symbolTable,
dependentComponents = dependentComponents
dependentComponents = dependentComponents,
initializedIrBuiltIns = irBuiltIns
)
}
@@ -79,9 +79,6 @@ class Fir2IrClassifierStorage(
with(typeConverter) { toIrType(typeContext) }
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) {
val firClass = ConeClassLikeLookupTagImpl(classId).toSymbol(session)!!.fir as FirRegularClass
val irClass = irBuiltinSymbol.owner
@@ -61,12 +61,15 @@ class Fir2IrConverter(
irGenerationExtensions: Collection<IrGenerationExtension>,
fir2irVisitor: Fir2IrVisitor,
fir2IrExtensions: Fir2IrExtensions,
runPreCacheBuiltinClasses: Boolean
) {
session.lazyDeclarationResolver.disableLazyResolveContractChecks()
for (firFile in allFirFiles) {
registerFileAndClasses(firFile, irModuleFragment)
}
classifierStorage.preCacheBuiltinClasses()
if (runPreCacheBuiltinClasses) {
classifierStorage.preCacheBuiltinClasses()
}
// The file processing is performed phase-to-phase:
// 1. Creation of all non-local regular classes
// 2. Class header processing (type parameters, supertypes, this receiver)
@@ -459,7 +462,8 @@ class Fir2IrConverter(
kotlinBuiltIns: KotlinBuiltIns,
signatureComposer: FirBasedSignatureComposer,
symbolTable: SymbolTable,
dependentComponents: List<Fir2IrComponents>
dependentComponents: List<Fir2IrComponents>,
initializedIrBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult {
val moduleDescriptor = FirModuleDescriptor(session, kotlinBuiltIns)
val components = Fir2IrComponentsStorage(
@@ -477,7 +481,7 @@ class Fir2IrConverter(
components.visibilityConverter = visibilityConverter
val typeConverter = Fir2IrTypeConverter(components)
components.typeConverter = typeConverter
val irBuiltIns = dependentComponents.lastOrNull()?.irBuiltIns ?: IrBuiltInsOverFir(
val irBuiltIns = initializedIrBuiltIns ?: IrBuiltInsOverFir(
components, languageVersionSettings, moduleDescriptor, irMangler,
languageVersionSettings.getFlag(AnalysisFlags.builtInsFromSources) || kotlinBuiltIns !== DefaultBuiltIns.Instance
)
@@ -505,7 +509,8 @@ class Fir2IrConverter(
}
converter.runSourcesConversion(
allFirFiles, irModuleFragment, irGenerationExtensions, fir2irVisitor, fir2IrExtensions
allFirFiles, irModuleFragment, irGenerationExtensions, fir2irVisitor, fir2IrExtensions,
runPreCacheBuiltinClasses = initializedIrBuiltIns == null
)
return Fir2IrResult(irModuleFragment, components, moduleDescriptor)
@@ -33082,6 +33082,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
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
@TestMetadata("kt-51753-1.kt")
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");
}
@Test
@TestMetadata("independentCommonSourceModules.kt")
public void testIndependentCommonSourceModules() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/multiModule/independentCommonSourceModules.kt");
}
@Test
@TestMetadata("kt-51753-1.kt")
public void testKt_51753_1() throws Exception {
@@ -136,7 +136,8 @@ fun AbstractFirAnalyzerFacade.convertToJsIr(
kotlinBuiltIns = builtIns ?: DefaultBuiltIns.Instance, // TODO: consider passing externally,
signatureComposer = signatureComposer,
symbolTable = symbolTable,
dependentComponents = emptyList()
dependentComponents = emptyList(),
initializedIrBuiltIns = null
).also {
(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.backend.Fir2IrComponents
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.FirJvmBackendExtension
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
@@ -80,6 +81,7 @@ class Fir2IrResultsConverter(
signatureComposerCreator = { JvmIdSignatureDescriptor(JvmDescriptorMangler(null)) },
manglerCreator = { FirJvmKotlinMangler() }
)
var irBuiltIns: IrBuiltInsOverFir? = null
for ((index, firOutputPart) in inputArtifact.partsForDependsOnModules.withIndex()) {
val dependentComponents = mutableListOf<Fir2IrComponents>()
@@ -93,6 +95,7 @@ class Fir2IrResultsConverter(
fir2IrExtensions, signatureComposer, symbolTable, dependentComponents, irBuiltIns
)
componentsMap[firOutputPart.module.name] = components
irBuiltIns = components.irBuiltIns
val irPart = JvmIrCodegenFactory.JvmIrBackendInput(
irModuleFragment,
@@ -139,6 +139,7 @@ object GenerationUtils {
signatureComposer = signatureComposer,
symbolTable = symbolTable,
dependentComponents = emptyList(),
irBuiltIns = null
)
val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext
@@ -38,7 +38,8 @@ abstract class AbstractFirAnalyzerFacade {
fir2IrExtensions: Fir2IrExtensions,
signatureComposer: FirBasedSignatureComposer,
symbolTable: SymbolTable,
dependentComponents: List<Fir2IrComponents>
dependentComponents: List<Fir2IrComponents>,
irBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult
}
@@ -108,7 +109,8 @@ class FirAnalyzerFacade(
fir2IrExtensions: Fir2IrExtensions,
signatureComposer: FirBasedSignatureComposer,
symbolTable: SymbolTable,
dependentComponents: List<Fir2IrComponents>
dependentComponents: List<Fir2IrComponents>,
irBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult {
if (_scopeSession == null) runResolution()
@@ -124,7 +126,8 @@ class FirAnalyzerFacade(
kotlinBuiltIns = DefaultBuiltIns.Instance, // TODO: consider passing externally,
signatureComposer = signatureComposer,
symbolTable = symbolTable,
dependentComponents = dependentComponents
dependentComponents = dependentComponents,
initializedIrBuiltIns = irBuiltIns
)
}
}
@@ -89,7 +89,8 @@ internal fun PhaseContext.fir2Ir(
kotlinBuiltIns = builtInsModule ?: DefaultBuiltIns.Instance, // TODO: consider passing externally
signatureComposer = signatureComposer,
symbolTable = symbolTable,
dependentComponents = emptyList()
dependentComponents = emptyList(),
initializedIrBuiltIns = null
).also {
(it.irModuleFragment.descriptor as? FirModuleDescriptor)?.let { it.allDependencyModules = librariesDescriptors }
}