[LL API] Don't invalidate 'LLFirResolvableResolveSession' on OOBs

This commit is contained in:
Yan Zhulanow
2023-03-16 01:35:21 +09:00
committed by Space Team
parent e8232a7572
commit bf977d4262
6 changed files with 29 additions and 25 deletions
@@ -30,13 +30,11 @@ class LLFirResolveSessionService(project: Project) {
}
private fun create(module: KtModule, factory: (KtModule) -> LLFirSession): LLFirResolvableResolveSession {
val session = factory(module)
return when (module) {
is KtSourceModule -> LLFirSourceResolveSession(session)
is KtLibraryModule, is KtLibrarySourceModule -> LLFirLibraryOrLibrarySourceResolvableResolveSession(session)
is KtScriptModule -> LLFirScriptResolveSession(session)
is KtNotUnderContentRootModule -> LLFirNotUnderContentRootResolveSession(session)
is KtSourceModule -> LLFirSourceResolveSession(module, factory)
is KtLibraryModule, is KtLibrarySourceModule -> LLFirLibraryOrLibrarySourceResolvableResolveSession(module, factory)
is KtScriptModule -> LLFirScriptResolveSession(module, factory)
is KtNotUnderContentRootModule -> LLFirNotUnderContentRootResolveSession(module, factory)
else -> {
errorWithFirSpecificEntries("Unexpected ${module::class.java}") {
withEntry("module", module) { it.moduleDescription }
@@ -14,8 +14,9 @@ import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile
internal class LLFirLibraryOrLibrarySourceResolvableResolveSession(
useSiteFirSession: LLFirSession
) : LLFirResolvableResolveSession(useSiteFirSession) {
useSiteKtModule: KtModule,
useSiteSessionFactory: (KtModule) -> LLFirSession
) : LLFirResolvableResolveSession(useSiteKtModule, useSiteSessionFactory) {
override fun getDiagnostics(element: KtElement, filter: DiagnosticCheckerFilter): List<KtPsiDiagnostic> =
emptyList()
@@ -13,8 +13,9 @@ import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile
internal class LLFirNotUnderContentRootResolveSession(
useSiteFirSession: LLFirSession
) : LLFirResolvableResolveSession(useSiteFirSession) {
useSiteKtModule: KtModule,
useSiteSessionFactory: (KtModule) -> LLFirSession
) : LLFirResolvableResolveSession(useSiteKtModule, useSiteSessionFactory) {
override fun getDiagnostics(element: KtElement, filter: DiagnosticCheckerFilter): List<KtPsiDiagnostic> =
emptyList()
@@ -5,8 +5,9 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.state
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.project.Project
import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider
@@ -41,21 +42,22 @@ import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtFile
@Suppress("PrivatePropertyName")
private val LOG = Logger.getInstance(LLFirResolvableResolveSession::class.java)
internal abstract class LLFirResolvableResolveSession(
final override val useSiteFirSession: LLFirSession
final override val useSiteKtModule: KtModule,
private val useSiteSessionFactory: (KtModule) -> LLFirSession
) : LLFirResolveSession() {
final override val useSiteKtModule: KtModule
get() = useSiteFirSession.ktModule
final override val project: Project
get() = useSiteKtModule.project
override fun getSessionFor(module: KtModule): LLFirSession {
LOG.assertTrue(useSiteFirSession.isValid, "Use-site session is invalid")
private val useSiteFirSessionCached = CachedValuesManager.getManager(project).createCachedValue {
val session = useSiteSessionFactory(useSiteKtModule)
CachedValueProvider.Result.create(session, session.modificationTracker)
}
final override val useSiteFirSession: LLFirSession
get() = useSiteFirSessionCached.value
override fun getSessionFor(module: KtModule): LLFirSession {
if (module == useSiteFirSession.ktModule) {
return useSiteFirSession
}
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.state
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.*
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
import org.jetbrains.kotlin.analysis.project.structure.*
import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError
import org.jetbrains.kotlin.diagnostics.KtPsiDiagnostic
@@ -14,8 +14,9 @@ import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile
internal class LLFirScriptResolveSession(
useSiteFirSession: LLFirSession
) : LLFirResolvableResolveSession(useSiteFirSession) {
useSiteKtModule: KtModule,
useSiteSessionFactory: (KtModule) -> LLFirSession
) : LLFirResolvableResolveSession(useSiteKtModule, useSiteSessionFactory) {
override fun getDiagnostics(element: KtElement, filter: DiagnosticCheckerFilter): List<KtPsiDiagnostic> {
val moduleComponents = getModuleComponentsForElement(element)
return moduleComponents.diagnosticsCollector.getDiagnosticsFor(element, filter)
@@ -17,8 +17,9 @@ import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile
internal class LLFirSourceResolveSession(
useSiteFirSession: LLFirSession
) : LLFirResolvableResolveSession(useSiteFirSession) {
useSiteKtModule: KtModule,
useSiteSessionFactory: (KtModule) -> LLFirSession
) : LLFirResolvableResolveSession(useSiteKtModule, useSiteSessionFactory) {
override fun getDiagnostics(element: KtElement, filter: DiagnosticCheckerFilter): List<KtPsiDiagnostic> {
val moduleComponents = getModuleComponentsForElement(element)
return moduleComponents.diagnosticsCollector.getDiagnosticsFor(element, filter)