From bb36beb3648647cf05cb106d90ff6db7ed2f68b3 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 1 Sep 2023 15:08:56 +0300 Subject: [PATCH] [FIR] Share enhancedSymbolStorage between common and platform sessions This is needed for two reasons: 1. common and platform modules are analyzed in the same setup with same dependencies and configurations, so the results of the enhancement for any function will be completely identical. So by sharing enhanced symbol storage, we avoid recomputation enhanced functions and improve performance 2. There is a goal to have some unique key for IR declarations in FIR2IR. For regular declarations, the key is just Fir symbol, and for fake-overrides it is a pair of original symbol and fake override owners lookup tag. But for enhanced functions the symbol is not unique, because we create different symbols for the same enhanced function for different modules. So this change fixes this problem ^KT-60397 Fixed This change doesn't affect any tests in the moment, because it's part of bigger refactoring of proper storing IR declarations during FIR2IR conversion (KT-61637) Without this change, there are some test breaks in branch for KT-61637: - FirPsiBlackBoxCodegenTestGenerated.Multiplatform.testStarImportOfExpectEnumWithActualTypeAlias - FirPsiBlackBoxCodegenTestGenerated.Multiplatform.K2.DefaultArguments.testNestedEnumEntryValue - FirPsiBlackBoxCodegenTestGenerated.Multiplatform.K2.Basic.testEnumEntryNameCall --- .../cli/common/FirSessionConstructionUtils.kt | 5 +++- .../fir/session/ComponentsContainers.kt | 12 ++++++--- .../fir/session/FirJvmSessionFactory.kt | 8 +++--- .../fir/session/FirSessionFactoryHelper.kt | 4 +-- .../java/enhancement/SignatureEnhancement.kt | 4 +-- .../test/frontend/fir/FirFrontendFacade.kt | 25 ++++++++++++------- 6 files changed, 38 insertions(+), 20 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt index eeeea768883..1e77b1d0407 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.OptInLanguageVersionSettingsCh import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider +import org.jetbrains.kotlin.fir.java.enhancement.FirEnhancedSymbolsStorage import org.jetbrains.kotlin.fir.session.* import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope @@ -72,7 +73,7 @@ fun prepareJvmSessions( createProviderAndScopeForIncrementalCompilation: (List) -> IncrementalCompilationContext?, ): List> { val javaSourcesScope = projectEnvironment.getSearchScopeForProjectJavaSources() - + val enhancementSymbolsStorage = FirEnhancedSymbolsStorage(firCachesFactoryForCliMode) return prepareSessions( files, configuration, rootModuleName, JvmPlatforms.unspecifiedJvmPlatform, JvmPlatformAnalyzerServices, metadataCompilationMode = false, libraryList, isCommonSource, fileBelongsToModule, @@ -86,6 +87,7 @@ fun prepareJvmSessions( librariesScope, projectEnvironment.getPackagePartProvider(librariesScope), configuration.languageVersionSettings, + predefinedEnhancementStorage = enhancementSymbolsStorage, registerExtraComponents = {}, ) } @@ -101,6 +103,7 @@ fun prepareJvmSessions( configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER), configuration.get(CommonConfigurationKeys.ENUM_WHEN_TRACKER), configuration.get(CommonConfigurationKeys.IMPORT_TRACKER), + predefinedEnhancementStorage = enhancementSymbolsStorage, needRegisterJavaElementFinder = true, registerExtraComponents = {}, sessionConfigurator, diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt index cd1b3cafec7..3956157c27b 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt @@ -90,9 +90,12 @@ fun FirSession.registerCommonComponentsAfterExtensionsAreConfigured() { register(FirProvidedDeclarationsForMetadataService::class, FirProvidedDeclarationsForMetadataService.create(this)) } +val firCachesFactoryForCliMode: FirCachesFactory + get() = FirThreadUnsafeCachesFactory + @OptIn(SessionConfiguration::class) fun FirSession.registerCliCompilerOnlyComponents() { - register(FirCachesFactory::class, FirThreadUnsafeCachesFactory) + register(FirCachesFactory::class, firCachesFactoryForCliMode) register(SealedClassInheritorsProvider::class, SealedClassInheritorsProviderImpl) register(FirLazyDeclarationResolver::class, FirDummyCompilerLazyDeclarationResolver) register(FirExceptionHandler::class, FirCliExceptionHandler) @@ -102,10 +105,13 @@ fun FirSession.registerCliCompilerOnlyComponents() { } @OptIn(SessionConfiguration::class) -fun FirSession.registerCommonJavaComponents(javaModuleResolver: JavaModuleResolver) { +fun FirSession.registerCommonJavaComponents( + javaModuleResolver: JavaModuleResolver, + predefinedEnhancementStorage: FirEnhancedSymbolsStorage? = null, +) { val jsr305State = languageVersionSettings.getFlag(JvmAnalysisFlags.javaTypeEnhancementState) register(FirAnnotationTypeQualifierResolver::class, FirAnnotationTypeQualifierResolver(this, jsr305State, javaModuleResolver)) - register(FirEnhancedSymbolsStorage::class, FirEnhancedSymbolsStorage(this)) + register(FirEnhancedSymbolsStorage::class, predefinedEnhancementStorage ?: FirEnhancedSymbolsStorage(this)) register(FirSyntheticPropertiesStorage::class, FirSyntheticPropertiesStorage(this)) register( FirJvmDefaultModeComponent::class, diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt index 2a7930eafed..dfe94d8fc27 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt @@ -19,9 +19,9 @@ import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.deserialization.JvmClassFileBasedSymbolProvider import org.jetbrains.kotlin.fir.java.deserialization.OptionalAnnotationClassesProvider +import org.jetbrains.kotlin.fir.java.enhancement.FirEnhancedSymbolsStorage import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider -import org.jetbrains.kotlin.fir.resolve.providers.impl.FirExtensionSyntheticFunctionInterfaceProvider import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment @@ -42,6 +42,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() { scope: AbstractProjectFileSearchScope, packagePartProvider: PackagePartProvider, languageVersionSettings: LanguageVersionSettings, + predefinedEnhancementStorage: FirEnhancedSymbolsStorage? = null, registerExtraComponents: ((FirSession) -> Unit), ): FirSession { return createLibrarySession( @@ -51,7 +52,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() { languageVersionSettings, extensionRegistrars, registerExtraComponents = { - it.registerCommonJavaComponents(projectEnvironment.getJavaModuleResolver()) + it.registerCommonJavaComponents(projectEnvironment.getJavaModuleResolver(), predefinedEnhancementStorage) registerExtraComponents(it) }, createKotlinScopeProvider = { FirKotlinScopeProvider(::wrapScopeWithJvmMapped) }, @@ -91,6 +92,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() { lookupTracker: LookupTracker? = null, enumWhenTracker: EnumWhenTracker? = null, importTracker: ImportTracker? = null, + predefinedEnhancementStorage: FirEnhancedSymbolsStorage? = null, needRegisterJavaElementFinder: Boolean, registerExtraComponents: ((FirSession) -> Unit) = {}, init: FirSessionConfigurator.() -> Unit = {} @@ -105,7 +107,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() { importTracker, init, registerExtraComponents = { - it.registerCommonJavaComponents(projectEnvironment.getJavaModuleResolver()) + it.registerCommonJavaComponents(projectEnvironment.getJavaModuleResolver(), predefinedEnhancementStorage) it.registerJavaSpecificResolveComponents() registerExtraComponents(it) }, diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt index 73f7319a057..5fdceeaa712 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt @@ -76,9 +76,9 @@ object FirSessionFactoryHelper { lookupTracker, enumWhenTracker, importTracker, - needRegisterJavaElementFinder, + needRegisterJavaElementFinder = needRegisterJavaElementFinder, registerExtraComponents = {}, - sessionConfigurator, + init = sessionConfigurator, ) } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index e301d37b6f5..88e9a753980 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt @@ -747,8 +747,8 @@ private class EnhancementSignatureParts( get() = (this as ConeTypeParameterLookupTag).symbol.fir.origin is FirDeclarationOrigin.Java } -class FirEnhancedSymbolsStorage(val session: FirSession) : FirSessionComponent { - private val cachesFactory = session.firCachesFactory +class FirEnhancedSymbolsStorage(private val cachesFactory: FirCachesFactory) : FirSessionComponent { + constructor(session: FirSession) : this(session.firCachesFactory) val cacheByOwner: FirCache = cachesFactory.createCache { _ -> EnhancementSymbolsCache(cachesFactory) } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt index c2d9bca63e5..22fd6d7b45a 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt @@ -25,10 +25,8 @@ import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider -import org.jetbrains.kotlin.fir.session.FirCommonSessionFactory -import org.jetbrains.kotlin.fir.session.FirJvmSessionFactory -import org.jetbrains.kotlin.fir.session.FirNativeSessionFactory -import org.jetbrains.kotlin.fir.session.FirSessionConfigurator +import org.jetbrains.kotlin.fir.java.enhancement.FirEnhancedSymbolsStorage +import org.jetbrains.kotlin.fir.session.* import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.WasmTarget @@ -54,6 +52,7 @@ import org.jetbrains.kotlin.test.services.* import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.NativeEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfigurator +import org.jetbrains.kotlin.utils.addToStdlib.runIf import java.nio.file.Paths open class FirFrontendFacade( @@ -97,6 +96,8 @@ open class FirFrontendFacade( val project = testServices.compilerConfigurationProvider.getProject(module) val extensionRegistrars = FirExtensionRegistrar.getInstances(project) + val targetPlatform = module.targetPlatform + val enhancedSymbolsStorage = runIf(targetPlatform.isJvm()) { FirEnhancedSymbolsStorage(firCachesFactoryForCliMode) } val projectEnvironment = createLibrarySession( module, project, @@ -104,12 +105,12 @@ open class FirFrontendFacade( testServices.firModuleInfoProvider.firSessionProvider, moduleDataProvider, testServices.compilerConfigurationProvider.getCompilerConfiguration(module), - extensionRegistrars + extensionRegistrars, + enhancedSymbolsStorage ) - val targetPlatform = module.targetPlatform val firOutputPartForDependsOnModules = sortedModules.map { - analyze(it, moduleDataMap[it]!!, targetPlatform, projectEnvironment, extensionRegistrars) + analyze(it, moduleDataMap[it]!!, targetPlatform, projectEnvironment, extensionRegistrars, enhancedSymbolsStorage) } return FirOutputArtifactImpl(firOutputPartForDependsOnModules) @@ -170,7 +171,8 @@ open class FirFrontendFacade( sessionProvider: FirProjectSessionProvider, moduleDataProvider: ModuleDataProvider, configuration: CompilerConfiguration, - extensionRegistrars: List + extensionRegistrars: List, + enhancedSymbolsStorage: FirEnhancedSymbolsStorage? ): AbstractProjectEnvironment? { val compilerConfigurationProvider = testServices.compilerConfigurationProvider val projectEnvironment: AbstractProjectEnvironment? @@ -208,6 +210,7 @@ open class FirFrontendFacade( projectFileSearchScope, packagePartProvider, languageVersionSettings, + predefinedEnhancementStorage = enhancedSymbolsStorage, registerExtraComponents = ::registerExtraComponents, ) } @@ -264,6 +267,7 @@ open class FirFrontendFacade( targetPlatform: TargetPlatform, projectEnvironment: AbstractProjectEnvironment?, extensionRegistrars: List, + enhancedSymbolsStorage: FirEnhancedSymbolsStorage?, ): FirOutputPartForDependsOnModule { val compilerConfigurationProvider = testServices.compilerConfigurationProvider val moduleInfoProvider = testServices.firModuleInfoProvider @@ -297,6 +301,7 @@ open class FirFrontendFacade( projectEnvironment, extensionRegistrars, sessionConfigurator, + enhancedSymbolsStorage, project, ktFiles ) @@ -325,8 +330,9 @@ open class FirFrontendFacade( projectEnvironment: AbstractProjectEnvironment?, extensionRegistrars: List, sessionConfigurator: FirSessionConfigurator.() -> Unit, + enhancedSymbolsStorage: FirEnhancedSymbolsStorage?, project: Project, - ktFiles: Collection + ktFiles: Collection, ): FirSession { val languageVersionSettings = module.languageVersionSettings return when { @@ -351,6 +357,7 @@ open class FirFrontendFacade( incrementalCompilationContext = null, extensionRegistrars, languageVersionSettings, + predefinedEnhancementStorage = enhancedSymbolsStorage, needRegisterJavaElementFinder = true, registerExtraComponents = ::registerExtraComponents, init = sessionConfigurator,