[FIR] Add configurable language version settings to FirSessionFactories

This commit is contained in:
Dmitriy Novozhilov
2020-10-01 13:55:48 +03:00
parent 5d76df6e1a
commit 3aa8b09e31
4 changed files with 25 additions and 17 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.session package org.jetbrains.kotlin.fir.session
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.analysis.CheckersComponent import org.jetbrains.kotlin.fir.analysis.CheckersComponent
import org.jetbrains.kotlin.fir.extensions.FirExtensionService import org.jetbrains.kotlin.fir.extensions.FirExtensionService
@@ -26,7 +27,7 @@ import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache
// -------------------------- Required components -------------------------- // -------------------------- Required components --------------------------
@OptIn(SessionConfiguration::class) @OptIn(SessionConfiguration::class)
fun FirSession.registerCommonComponents() { fun FirSession.registerCommonComponents(languageVersionSettings: LanguageVersionSettings) {
register(FirDeclaredMemberScopeProvider::class, FirDeclaredMemberScopeProvider()) register(FirDeclaredMemberScopeProvider::class, FirDeclaredMemberScopeProvider())
register(FirCorrespondingSupertypesCache::class, FirCorrespondingSupertypesCache(this)) register(FirCorrespondingSupertypesCache::class, FirCorrespondingSupertypesCache(this))
register(FirDefaultParametersResolver::class, FirDefaultParametersResolver()) register(FirDefaultParametersResolver::class, FirDefaultParametersResolver())
@@ -35,7 +36,7 @@ fun FirSession.registerCommonComponents() {
register(FirRegisteredPluginAnnotations::class, FirRegisteredPluginAnnotations.create(this)) register(FirRegisteredPluginAnnotations::class, FirRegisteredPluginAnnotations.create(this))
register(FirPredicateBasedProvider::class, FirPredicateBasedProvider.create(this)) register(FirPredicateBasedProvider::class, FirPredicateBasedProvider.create(this))
register(GeneratedClassIndex::class, GeneratedClassIndex.create()) register(GeneratedClassIndex::class, GeneratedClassIndex.create())
register(FirLanguageSettingsComponent::class, FirLanguageSettingsComponent(this)) register(FirLanguageSettingsComponent::class, FirLanguageSettingsComponent(languageVersionSettings))
register(InferenceComponents::class, InferenceComponents(this)) register(InferenceComponents::class, InferenceComponents(this))
} }
@@ -10,7 +10,8 @@ import com.intellij.psi.PsiElementFinder
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.annotations.TestOnly import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.FirModuleBasedSession import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.PrivateSessionConstructor import org.jetbrains.kotlin.fir.PrivateSessionConstructor
import org.jetbrains.kotlin.fir.SessionConfiguration import org.jetbrains.kotlin.fir.SessionConfiguration
@@ -62,10 +63,11 @@ object FirSessionFactory {
sessionProvider: FirProjectSessionProvider, sessionProvider: FirProjectSessionProvider,
scope: GlobalSearchScope, scope: GlobalSearchScope,
dependenciesProvider: FirSymbolProvider? = null, dependenciesProvider: FirSymbolProvider? = null,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
init: FirSessionConfigurator.() -> Unit = {} init: FirSessionConfigurator.() -> Unit = {}
): FirJavaModuleBasedSession { ): FirJavaModuleBasedSession {
return FirJavaModuleBasedSession(moduleInfo, sessionProvider).apply { return FirJavaModuleBasedSession(moduleInfo, sessionProvider).apply {
registerCommonComponents() registerCommonComponents(languageVersionSettings)
registerResolveComponents() registerResolveComponents()
registerJavaSpecificResolveComponents() registerJavaSpecificResolveComponents()
@@ -101,7 +103,8 @@ object FirSessionFactory {
sessionProvider: FirProjectSessionProvider, sessionProvider: FirProjectSessionProvider,
scope: GlobalSearchScope, scope: GlobalSearchScope,
project: Project, project: Project,
packagePartProvider: PackagePartProvider packagePartProvider: PackagePartProvider,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
): FirLibrarySession { ): FirLibrarySession {
val javaClassFinder = JavaClassFinderImpl().apply { val javaClassFinder = JavaClassFinderImpl().apply {
this.setProjectInstance(project) this.setProjectInstance(project)
@@ -110,7 +113,7 @@ object FirSessionFactory {
val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(scope) val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(scope)
return FirLibrarySession(moduleInfo, sessionProvider).apply { return FirLibrarySession(moduleInfo, sessionProvider).apply {
registerCommonComponents() registerCommonComponents(languageVersionSettings)
val javaSymbolProvider = JavaSymbolProvider(this, sessionProvider.project, scope) val javaSymbolProvider = JavaSymbolProvider(this, sessionProvider.project, scope)
@@ -6,15 +6,11 @@
package org.jetbrains.kotlin.fir package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
@NoMutableState @NoMutableState
class FirLanguageSettingsComponent(val session: FirSession) : FirSessionComponent { class FirLanguageSettingsComponent(val languageVersionSettings: LanguageVersionSettings) : FirSessionComponent
val languageVersionSettings: LanguageVersionSettings =
LanguageVersionSettingsImpl.DEFAULT // TODO
}
val FirSession.languageSettingsComponent: FirLanguageSettingsComponent by FirSession.sessionComponentAccessor() private val FirSession.languageSettingsComponent: FirLanguageSettingsComponent by FirSession.sessionComponentAccessor()
val FirSession.languageVersionSettings: LanguageVersionSettings val FirSession.languageVersionSettings: LanguageVersionSettings
get() = languageSettingsComponent.languageVersionSettings get() = languageSettingsComponent.languageVersionSettings
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.sessions package org.jetbrains.kotlin.idea.fir.low.level.api.sessions
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.fir.BuiltinTypes import org.jetbrains.kotlin.fir.BuiltinTypes
import org.jetbrains.kotlin.fir.PrivateSessionConstructor import org.jetbrains.kotlin.fir.PrivateSessionConstructor
import org.jetbrains.kotlin.fir.SessionConfiguration import org.jetbrains.kotlin.fir.SessionConfiguration
@@ -52,6 +54,7 @@ internal object FirIdeSessionFactory {
builtinTypes: BuiltinTypes, builtinTypes: BuiltinTypes,
sessionsCache: MutableMap<ModuleSourceInfo, FirIdeSourcesSession>, sessionsCache: MutableMap<ModuleSourceInfo, FirIdeSourcesSession>,
isRootModule: Boolean, isRootModule: Boolean,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
): FirIdeSourcesSession { ): FirIdeSourcesSession {
sessionsCache[moduleInfo]?.let { return it } sessionsCache[moduleInfo]?.let { return it }
val scopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped) val scopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped)
@@ -67,7 +70,7 @@ internal object FirIdeSessionFactory {
val cache = ModuleFileCacheImpl(this) val cache = ModuleFileCacheImpl(this)
val firPhaseManager = IdeFirPhaseManager(FirLazyDeclarationResolver(firFileBuilder), cache, sessionInvalidator) val firPhaseManager = IdeFirPhaseManager(FirLazyDeclarationResolver(firFileBuilder), cache, sessionInvalidator)
registerCommonComponents() registerCommonComponents(languageVersionSettings)
registerResolveComponents() registerResolveComponents()
registerIdeComponents() registerIdeComponents()
@@ -130,6 +133,7 @@ internal object FirIdeSessionFactory {
project: Project, project: Project,
builtinsAndCloneableSession: FirIdeBuiltinsAndCloneableSession, builtinsAndCloneableSession: FirIdeBuiltinsAndCloneableSession,
builtinTypes: BuiltinTypes, builtinTypes: BuiltinTypes,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
): FirIdeLibrariesSession { ): FirIdeLibrariesSession {
checkCanceled() checkCanceled()
val searchScope = ModuleLibrariesSearchScope(moduleInfo.module) val searchScope = ModuleLibrariesSearchScope(moduleInfo.module)
@@ -141,7 +145,7 @@ internal object FirIdeSessionFactory {
val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(searchScope) val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(searchScope)
return FirIdeLibrariesSession(moduleInfo, project, searchScope, builtinTypes).apply { return FirIdeLibrariesSession(moduleInfo, project, searchScope, builtinTypes).apply {
registerCommonComponents() registerCommonComponents(languageVersionSettings)
registerJavaSpecificResolveComponents() registerJavaSpecificResolveComponents()
registerIdeComponents() registerIdeComponents()
@@ -175,9 +179,13 @@ internal object FirIdeSessionFactory {
} }
} }
fun createBuiltinsAndCloneableSession(project: Project, builtinTypes: BuiltinTypes): FirIdeBuiltinsAndCloneableSession { fun createBuiltinsAndCloneableSession(
project: Project,
builtinTypes: BuiltinTypes,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT
): FirIdeBuiltinsAndCloneableSession {
return FirIdeBuiltinsAndCloneableSession(project, builtinTypes).apply { return FirIdeBuiltinsAndCloneableSession(project, builtinTypes).apply {
registerCommonComponents() registerCommonComponents(languageVersionSettings)
registerIdeComponents() registerIdeComponents()
val kotlinScopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped) val kotlinScopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped)