diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt index f88f19c9c25..07432345f88 100644 --- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.impl.base import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ProjectRootModificationTracker +import com.intellij.openapi.util.LowMemoryWatcher import com.intellij.psi.util.PsiModificationTracker import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals @@ -61,6 +62,10 @@ private class KtAnalysisSessionCache(project: Project) { ) ) + init { + LowMemoryWatcher.register({ cache.clearCachedValues() }, project) + } + @TestOnly fun clear() { cache.clear() diff --git a/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/caches/SoftCachedMap.kt b/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/caches/SoftCachedMap.kt index 130c1afba5c..3785e883984 100644 --- a/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/caches/SoftCachedMap.kt +++ b/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/caches/SoftCachedMap.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.util.CachedValue import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager +import com.intellij.util.CachedValueBase import com.intellij.util.containers.ContainerUtil import java.util.concurrent.ConcurrentHashMap @@ -17,6 +18,8 @@ public abstract class SoftCachedMap { public abstract fun clear() + public abstract fun clearCachedValues() + public companion object { public fun create( project: Project, @@ -48,6 +51,12 @@ private class SoftCachedMapWithTrackers( cache.clear() } + override fun clearCachedValues() { + cache.values.forEach { + (it as? CachedValueBase<*>)?.clear() + } + } + override fun getOrPut(key: K, create: () -> V): V { return cache.getOrPut(key) { CachedValuesManager.getManager(project).createCachedValue { @@ -67,6 +76,8 @@ private class SoftCachedMapWithoutTrackers(kind: Kind) : SoftC cache.clear() } + override fun clearCachedValues() {} + override fun getOrPut(key: K, create: () -> V): V { return cache.getOrPut(key, create) }