[LL FIR] KT-58257 Restore invalidation of KtFirAnalysisSession via the project-wide OOBM tracker

- `KtReadActionConfinementLifetimeToken` tracks its validity via the
  project-wide out-of-block modification tracker. Out-of-block
  invalidation of some LL FIR session will cause the lifetime tokens of
  all analysis sessions to become invalid, including unrelated sessions,
  because of this project-wide tracking.
- If `KtFirAnalysisSession`s are only invalidated when their underlying
  LL FIR session is invalidated, the cache may expose analysis sessions
  which contain invalid lifetime tokens after out-of-block modification.
  Even though an analysis session will still be practically valid if its
  underlying LL FIR session is valid, the lifetime token will *think*
  that the PSI has changed and throw an "access to invalid token"
  exception.
- Hence, we cannot currently invalidate `KtFirAnalysisSession`
  granularly and project-wide OOBM tracking needs to be restored.

^KT-60272
This commit is contained in:
Marco Pennekamp
2023-07-28 14:10:29 +02:00
committed by Space Team
parent 2ba42b8677
commit 9c3fa5e878
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.analysis.api.session.KtAnalysisSessionProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getFirResolveSession
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.psi.KtElement
import java.util.concurrent.ConcurrentMap
import kotlin.reflect.KClass
@@ -47,6 +48,7 @@ class KtFirAnalysisSessionProvider(project: Project) : KtAnalysisSessionProvider
CachedValueProvider.Result(
KtFirAnalysisSession.createAnalysisSessionByFirResolveSession(firResolveSession, validityToken),
firResolveSession.useSiteFirSession.createValidityTracker(),
project.createProjectWideOutOfBlockModificationTracker(),
)
}
}.value