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,