From 1edc9f0a1dc93d62c510116341657972b21cbc29 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Tue, 10 Jan 2023 15:47:15 +0100 Subject: [PATCH] [FIR] Introduce FirCommonSessionFactory --- .../fir/session/FirCommonSessionFactory.kt | 154 ++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt new file mode 100644 index 00000000000..d747e58ae2e --- /dev/null +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt @@ -0,0 +1,154 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.session + +import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl +import org.jetbrains.kotlin.fir.FirModuleData +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.SessionConfiguration +import org.jetbrains.kotlin.fir.checkers.registerJsCheckers +import org.jetbrains.kotlin.fir.checkers.registerJvmCheckers +import org.jetbrains.kotlin.fir.checkers.registerNativeCheckers +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin +import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider +import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider +import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar +import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider +import org.jetbrains.kotlin.fir.java.JavaSymbolProvider +import org.jetbrains.kotlin.fir.java.deserialization.MetadataSymbolProvider +import org.jetbrains.kotlin.fir.java.deserialization.OptionalAnnotationClassesProvider +import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider +import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider +import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider +import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment +import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope +import org.jetbrains.kotlin.incremental.components.EnumWhenTracker +import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.load.kotlin.PackagePartProvider +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.serialization.deserialization.KotlinMetadataFinder + +object FirCommonSessionFactory : FirAbstractSessionFactory() { + fun createLibrarySession( + mainModuleName: Name, + sessionProvider: FirProjectSessionProvider, + moduleDataProvider: ModuleDataProvider, + projectEnvironment: AbstractProjectEnvironment, + scope: AbstractProjectFileSearchScope, + packagePartProvider: PackagePartProvider, + languageVersionSettings: LanguageVersionSettings, + registerExtraComponents: ((FirSession) -> Unit), + ): FirSession { + return createLibrarySession( + mainModuleName, + sessionProvider, + moduleDataProvider, + languageVersionSettings, + registerExtraComponents = { + it.registerCommonJavaComponents(projectEnvironment.getJavaModuleResolver()) + registerExtraComponents(it) + }, + createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _ -> declaredMemberScope } }, + createProviders = { session, builtinsModuleData, kotlinScopeProvider -> + listOf( + MetadataSymbolProvider( + session, + moduleDataProvider, + kotlinScopeProvider, + packagePartProvider, + projectEnvironment.getKotlinClassFinder(scope) + ), + FirBuiltinSymbolProvider(session, builtinsModuleData, kotlinScopeProvider), + FirCloneableSymbolProvider(session, builtinsModuleData, kotlinScopeProvider), + OptionalAnnotationClassesProvider(session, moduleDataProvider, kotlinScopeProvider, packagePartProvider) + ) + } + ) + } + + @OptIn(SessionConfiguration::class) + fun createModuleBasedSession( + moduleData: FirModuleData, + sessionProvider: FirProjectSessionProvider, + javaSourcesScope: AbstractProjectFileSearchScope, + projectEnvironment: AbstractProjectEnvironment, + incrementalCompilationContext: IncrementalCompilationContext?, + extensionRegistrars: List, + languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, + lookupTracker: LookupTracker? = null, + enumWhenTracker: EnumWhenTracker? = null, + needRegisterJavaElementFinder: Boolean, + registerExtraComponents: ((FirSession) -> Unit) = {}, + init: FirSessionConfigurator.() -> Unit = {} + ): FirSession { + return createModuleBasedSession( + moduleData, + sessionProvider, + extensionRegistrars, + languageVersionSettings, + lookupTracker, + enumWhenTracker, + init, + registerExtraComponents = { + it.registerCommonJavaComponents(projectEnvironment.getJavaModuleResolver()) + it.registerJavaSpecificResolveComponents() + registerExtraComponents(it) + }, + registerExtraCheckers = { + it.registerJvmCheckers() + it.registerJsCheckers() + it.registerNativeCheckers() + }, + createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _ -> declaredMemberScope } }, + createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, dependencies -> + var symbolProviderForBinariesFromIncrementalCompilation: MetadataSymbolProvider? = null + var optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation: OptionalAnnotationClassesProvider? = null + incrementalCompilationContext?.let { + val precompiledBinariesPackagePartProvider = it.precompiledBinariesPackagePartProvider + if (precompiledBinariesPackagePartProvider != null && it.precompiledBinariesFileScope != null) { + val moduleDataProvider = SingleModuleDataProvider(moduleData) + symbolProviderForBinariesFromIncrementalCompilation = + MetadataSymbolProvider( + session, + moduleDataProvider, + kotlinScopeProvider, + precompiledBinariesPackagePartProvider, + projectEnvironment.getKotlinClassFinder(it.precompiledBinariesFileScope) as KotlinMetadataFinder, + defaultDeserializationOrigin = FirDeclarationOrigin.Precompiled + ) + optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation = + OptionalAnnotationClassesProvider( + session, + moduleDataProvider, + kotlinScopeProvider, + precompiledBinariesPackagePartProvider, + defaultDeserializationOrigin = FirDeclarationOrigin.Precompiled + ) + } + } + + val javaSymbolProvider = + JavaSymbolProvider(session, projectEnvironment.getFirJavaFacade(session, moduleData, javaSourcesScope)) + session.register(JavaSymbolProvider::class, javaSymbolProvider) + + listOfNotNull( + symbolProvider, + *(incrementalCompilationContext?.previousFirSessionsSymbolProviders?.toTypedArray() ?: emptyArray()), + symbolProviderForBinariesFromIncrementalCompilation, + generatedSymbolsProvider, + javaSymbolProvider, + *dependencies.toTypedArray(), + optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation, + ) + } + ).also { + if (needRegisterJavaElementFinder) { + projectEnvironment.registerAsJavaElementFinder(it) + } + } + } +} \ No newline at end of file