FIR IDE: make some session components to be non-thread local

To avoid memory leaks
This commit is contained in:
Ilya Kirillov
2020-11-05 10:58:36 +03:00
parent c3caa3a137
commit 65b5e4b62b
2 changed files with 6 additions and 5 deletions
@@ -41,9 +41,9 @@ private constructor(
override val scopeProvider by threadLocal { KtFirScopeProvider(this, firSymbolBuilder, project, firResolveState, token) } override val scopeProvider by threadLocal { KtFirScopeProvider(this, firSymbolBuilder, project, firResolveState, token) }
override val symbolProvider: KtSymbolProvider = override val symbolProvider: KtSymbolProvider =
KtFirSymbolProvider(this, firResolveState.rootModuleSession.firSymbolProvider, firResolveState, firSymbolBuilder, token) KtFirSymbolProvider(this, firResolveState.rootModuleSession.firSymbolProvider, firResolveState, firSymbolBuilder, token)
override val completionCandidateChecker: KtCompletionCandidateChecker by threadLocal { KtFirCompletionCandidateChecker(this, token) } override val completionCandidateChecker: KtCompletionCandidateChecker = KtFirCompletionCandidateChecker(this, token)
override val symbolDeclarationOverridesProvider: KtSymbolDeclarationOverridesProvider override val symbolDeclarationOverridesProvider: KtSymbolDeclarationOverridesProvider =
by threadLocal { KtFirSymbolDeclarationOverridesProvider(this, token) } KtFirSymbolDeclarationOverridesProvider(this, token)
override fun createContextDependentCopy(): KtAnalysisSession { override fun createContextDependentCopy(): KtAnalysisSession {
check(!isContextSession) { "Cannot create context-dependent copy of KtAnalysis session from a context dependent one" } check(!isContextSession) { "Cannot create context-dependent copy of KtAnalysis session from a context dependent one" }
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.KtSimpleNameExpression
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.util.concurrent.ConcurrentHashMap
internal class KtFirCompletionCandidateChecker( internal class KtFirCompletionCandidateChecker(
analysisSession: KtFirAnalysisSession, analysisSession: KtFirAnalysisSession,
@@ -40,7 +41,7 @@ internal class KtFirCompletionCandidateChecker(
override val analysisSession: KtFirAnalysisSession by weakRef(analysisSession) override val analysisSession: KtFirAnalysisSession by weakRef(analysisSession)
private val completionContextCache = private val completionContextCache =
HashMap<Pair<FirFile, KtCallableDeclaration>, LowLevelFirApiFacadeForCompletion.FirCompletionContext>() ConcurrentHashMap<Pair<FirFile, KtCallableDeclaration>, LowLevelFirApiFacadeForCompletion.FirCompletionContext>()
override fun checkExtensionFitsCandidate( override fun checkExtensionFitsCandidate(
firSymbolForCandidate: KtCallableSymbol, firSymbolForCandidate: KtCallableSymbol,
@@ -94,7 +95,7 @@ internal class KtFirCompletionCandidateChecker(
): Sequence<ImplicitReceiverValue<*>?> { ): Sequence<ImplicitReceiverValue<*>?> {
val enclosingContext = EnclosingDeclarationContext.detect(originalFile, fakeNameExpression) val enclosingContext = EnclosingDeclarationContext.detect(originalFile, fakeNameExpression)
val completionContext = completionContextCache.getOrCreate(firFile to enclosingContext.fakeEnclosingDeclaration) { val completionContext = completionContextCache.computeIfAbsent(firFile to enclosingContext.fakeEnclosingDeclaration) {
enclosingContext.buildCompletionContext(firFile, firResolveState) enclosingContext.buildCompletionContext(firFile, firResolveState)
} }