From e601b01be2a7a48b159a80b76ba1fdaab892ad67 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Thu, 26 Jan 2023 21:20:34 +0100 Subject: [PATCH] [FIR2IR] Use single IrBuiltInsOverFir for all MPP source modules ^KT-56229 Fixed --- .../based/LowLevelFirAnalyzerFacade.kt | 4 +++- .../jetbrains/kotlin/cli/js/K2JsIrCompiler.kt | 3 ++- .../kotlin/fir/pipeline/convertToIr.kt | 20 ++++++++++--------- .../fir/backend/Fir2IrClassifierStorage.kt | 3 --- .../kotlin/fir/backend/Fir2IrConverter.kt | 13 ++++++++---- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../independentCommonSourceModules.kt | 20 +++++++++++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../frontend/fir/Fir2IrJsResultsConverter.kt | 3 ++- .../frontend/fir/Fir2IrResultsConverter.kt | 3 +++ .../kotlin/codegen/GenerationUtils.kt | 1 + .../jetbrains/kotlin/fir/FirAnalyzerFacade.kt | 9 ++++++--- .../jetbrains/kotlin/backend/konan/Fir2Ir.kt | 3 ++- 13 files changed, 71 insertions(+), 23 deletions(-) create mode 100644 compiler/testData/codegen/box/multiplatform/multiModule/independentCommonSourceModules.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/LowLevelFirAnalyzerFacade.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/LowLevelFirAnalyzerFacade.kt index 418a95dea5c..1dc6254ee4b 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/LowLevelFirAnalyzerFacade.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/LowLevelFirAnalyzerFacade.kt @@ -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 + dependentComponents: List, + irBuiltIns: IrBuiltInsOverFir? ): Fir2IrResult = shouldNotBeCalled() } diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt index 900e8f86146..77b4fc6560b 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt @@ -600,7 +600,8 @@ class K2JsIrCompiler : CLICompiler() { 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 } } diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt index 88b1e3f0b38..c6a64b5ef89 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt @@ -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 + dependentComponents: List, + 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 ) } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index 592ce93ff97..cf39e928070 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -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 diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index 17a1dce6914..9554a9d4d6c 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -61,12 +61,15 @@ class Fir2IrConverter( irGenerationExtensions: Collection, 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 + dependentComponents: List, + 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) diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 72ab6c60546..4236c4ce3ee 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -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 { diff --git a/compiler/testData/codegen/box/multiplatform/multiModule/independentCommonSourceModules.kt b/compiler/testData/codegen/box/multiplatform/multiModule/independentCommonSourceModules.kt new file mode 100644 index 00000000000..3d69c9f9cd0 --- /dev/null +++ b/compiler/testData/codegen/box/multiplatform/multiModule/independentCommonSourceModules.kt @@ -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() \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 998c0c07681..ef37d0be68f 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -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 { diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt index 1fd94916aec..ac47dcd8863 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt @@ -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 } } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrResultsConverter.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrResultsConverter.kt index 9d5d6d5a6e7..eaca6f4c765 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrResultsConverter.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrResultsConverter.kt @@ -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() @@ -93,6 +95,7 @@ class Fir2IrResultsConverter( fir2IrExtensions, signatureComposer, symbolTable, dependentComponents, irBuiltIns ) componentsMap[firOutputPart.module.name] = components + irBuiltIns = components.irBuiltIns val irPart = JvmIrCodegenFactory.JvmIrBackendInput( irModuleFragment, diff --git a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt index 14d84592a4c..b5f0f4fd1b3 100644 --- a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt +++ b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt @@ -139,6 +139,7 @@ object GenerationUtils { signatureComposer = signatureComposer, symbolTable = symbolTable, dependentComponents = emptyList(), + irBuiltIns = null ) val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext diff --git a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt index 887caaf4a6a..efaad99adf6 100644 --- a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt +++ b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt @@ -38,7 +38,8 @@ abstract class AbstractFirAnalyzerFacade { fir2IrExtensions: Fir2IrExtensions, signatureComposer: FirBasedSignatureComposer, symbolTable: SymbolTable, - dependentComponents: List + dependentComponents: List, + irBuiltIns: IrBuiltInsOverFir? ): Fir2IrResult } @@ -108,7 +109,8 @@ class FirAnalyzerFacade( fir2IrExtensions: Fir2IrExtensions, signatureComposer: FirBasedSignatureComposer, symbolTable: SymbolTable, - dependentComponents: List + dependentComponents: List, + 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 ) } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt index 6779d98ef93..26cda5d6662 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt @@ -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 } }