[FIR2IR] Use single IrBuiltInsOverFir for all MPP source modules
^KT-56229 Fixed
This commit is contained in:
committed by
Space Team
parent
001b11f285
commit
e601b01be2
+3
-1
@@ -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)
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+20
@@ -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()
|
||||
+6
@@ -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 {
|
||||
|
||||
+2
-1
@@ -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 }
|
||||
}
|
||||
|
||||
+3
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -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 }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user