From 8b782d595470c1dc6d355868e69eb18eeb5b488f Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 24 Aug 2020 14:15:19 +0300 Subject: [PATCH] FIR IDE: fix session provider implementation as it only provides only 2 sessions --- .../level/api/FirIdeResolveStateService.kt | 10 ++-- .../low/level/api/FirIdeSessionProvider.kt | 30 ------------ .../low/level/api/FirModuleResolveState.kt | 1 + .../level/api/file/builder/FirFileBuilder.kt | 3 -- .../api/sessions/FirIdeLibrarySession.kt | 2 - .../low/level/api/sessions/FirIdeSession.kt | 1 - .../api/sessions/FirIdeSessionProvider.kt | 48 +++++++++++++++++++ .../api/sessions/FirIdeSourcesSession.kt | 5 +- 8 files changed, 58 insertions(+), 42 deletions(-) delete mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeSessionProvider.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProvider.kt diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeResolveStateService.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeResolveStateService.kt index f9e7dc79824..b57c168a077 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeResolveStateService.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeResolveStateService.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.idea.util.psiModificationTrackerBasedCachedValue import java.util.concurrent.ConcurrentHashMap import org.jetbrains.kotlin.idea.caches.project.* import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeModuleLibraryDependenciesSession +import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSessionProvider import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSourcesSession internal class FirIdeResolveStateService(private val project: Project) { @@ -19,19 +20,22 @@ internal class FirIdeResolveStateService(private val project: Project) { } private fun createResolveStateFor(moduleInfo: IdeaModuleInfo): FirModuleResolveStateImpl { - val sessionProvider = FirIdeSessionProvider(project) val firPhaseRunner = FirPhaseRunner() + val sessionProvider = FirIdeSessionProvider(project) val librariesSession = FirIdeModuleLibraryDependenciesSession.create(moduleInfo as ModuleSourceInfo, sessionProvider, project) - val sourcesSession = FirIdeSourcesSession.create( project, moduleInfo, firPhaseRunner, sessionProvider, librariesSession, - ).apply { sessionProvider.registerSession(moduleInfo, this) } + ) + sessionProvider.apply { + setSourcesSession(sourcesSession) + setLibrariesSession(librariesSession) + } return FirModuleResolveStateImpl( moduleInfo, diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeSessionProvider.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeSessionProvider.kt deleted file mode 100644 index 757e9404f76..00000000000 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeSessionProvider.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2010-2020 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.idea.fir.low.level.api - -import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.analyzer.ModuleInfo -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider -import org.jetbrains.kotlin.idea.caches.project.getModuleInfo -import org.jetbrains.kotlin.psi.KtElement -import java.util.concurrent.ConcurrentHashMap -import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.ThreadSafe - -@ThreadSafe -internal class FirIdeSessionProvider(project: Project) : FirProjectSessionProvider(project) { - override val sessionCache = ConcurrentHashMap() - - fun getSession(psi: KtElement): FirSession { - val moduleInfo = psi.getModuleInfo() - return getSession(moduleInfo) - } - - override fun getSession(moduleInfo: ModuleInfo): FirSession { - return sessionCache[moduleInfo] - ?: error("$moduleInfo") - } -} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveState.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveState.kt index f68bfd19191..632fcb5e897 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveState.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveState.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.PsiToFirCache import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache import org.jetbrains.kotlin.idea.fir.low.level.api.providers.FirIdeProvider +import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSessionProvider import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/builder/FirFileBuilder.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/builder/FirFileBuilder.kt index d743dde276f..a863bd0a83d 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/builder/FirFileBuilder.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/builder/FirFileBuilder.kt @@ -9,9 +9,7 @@ import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.resolve.ScopeSession -import org.jetbrains.kotlin.fir.resolve.transformers.createTransformerBasedProcessorByPhase import org.jetbrains.kotlin.fir.scopes.FirScopeProvider -import org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeSessionProvider import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.ThreadSafe @@ -22,7 +20,6 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.ThreadSafe */ @ThreadSafe internal class FirFileBuilder( - private val sessionProvider: FirIdeSessionProvider, private val scopeProvider: FirScopeProvider, private val firPhaseRunner: FirPhaseRunner ) { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt index 565d85b90b5..52d37d823a4 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.sessions import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope -import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider import org.jetbrains.kotlin.fir.registerCommonComponents @@ -19,7 +18,6 @@ import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider -import org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeSessionProvider import org.jetbrains.kotlin.idea.fir.low.level.api.IdeSessionComponents import org.jetbrains.kotlin.load.java.JavaClassFinderImpl import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSession.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSession.kt index b6c8c8c9d4d..051fe85a219 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSession.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSession.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.sessions import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeSessionProvider internal abstract class FirIdeSession(sessionProvider: FirIdeSessionProvider) : FirSession(sessionProvider) { abstract val scope: GlobalSearchScope diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProvider.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProvider.kt new file mode 100644 index 00000000000..236927622dc --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProvider.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2010-2020 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.idea.fir.low.level.api.sessions + +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.analyzer.ModuleInfo +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.FirSessionProvider +import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider +import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo +import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo +import org.jetbrains.kotlin.idea.caches.project.getModuleInfo +import org.jetbrains.kotlin.idea.caches.project.isLibraryClasses +import org.jetbrains.kotlin.psi.KtElement +import java.util.concurrent.ConcurrentHashMap +import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.ThreadSafe + +@ThreadSafe +internal class FirIdeSessionProvider( + override val project: Project, +) : FirSessionProvider { + private lateinit var sourcesSession: FirIdeSourcesSession + private lateinit var librariesSession: FirIdeModuleLibraryDependenciesSession + + + fun setSourcesSession(sourcesSession: FirIdeSourcesSession) { + check(!this::sourcesSession.isInitialized) + this.sourcesSession = sourcesSession + } + + fun setLibrariesSession(librariesSession: FirIdeModuleLibraryDependenciesSession) { + check(!this::librariesSession.isInitialized) + this.librariesSession = librariesSession + } + + override fun getSession(moduleInfo: ModuleInfo): FirSession = when { + moduleInfo is IdeaModuleInfo && moduleInfo.isLibraryClasses() -> { + librariesSession /* TODO check if library is in libraries session scope */ + } + moduleInfo is ModuleSourceInfo -> { + sourcesSession /* TODO check if source is in sources session scope */ + } + else -> error("Invalid module info $moduleInfo") + } +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSourcesSession.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSourcesSession.kt index 17bd9cd360c..be453290a1d 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSourcesSession.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSourcesSession.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped import org.jetbrains.kotlin.fir.resolve.transformers.PhasedFirFileResolver import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo -import org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeSessionProvider import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner import org.jetbrains.kotlin.idea.fir.low.level.api.IdePhasedFirFileResolver import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder @@ -49,11 +48,11 @@ internal class FirIdeSourcesSession private constructor( project: Project, moduleInfo: ModuleSourceInfo, firPhaseRunner: FirPhaseRunner, - sessionProvider: FirSessionProvider, + sessionProvider: FirIdeSessionProvider, librariesSession: FirIdeModuleLibraryDependenciesSession, ): FirIdeSourcesSession { val scopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped) - val firBuilder = FirFileBuilder(sessionProvider as FirIdeSessionProvider, scopeProvider, firPhaseRunner) + val firBuilder = FirFileBuilder(scopeProvider, firPhaseRunner) val dependentModules = moduleInfo.collectTransitiveDependenciesWithSelf().filterIsInstance() val searchScope = ModuleWithDependentsScope(project, dependentModules.map { it.module }) return FirIdeSourcesSession(sessionProvider, searchScope, firBuilder).apply {