[LL API] Refactor session caches

Use 'CachedValue' and dependency handling with 'ModificationTracker'
for dependent session invalidation.
This commit is contained in:
Yan Zhulanow
2023-03-10 16:18:32 +09:00
committed by Space Team
parent c3b2d9dc5b
commit 5c9a9913db
31 changed files with 372 additions and 622 deletions
@@ -6,15 +6,39 @@
package org.jetbrains.kotlin.analysis.utils.trackers
import com.intellij.openapi.util.ModificationTracker
import java.util.*
import kotlin.collections.ArrayList
public class CompositeModificationTracker private constructor(private val trackers: List<ModificationTracker>) : ModificationTracker {
override fun getModificationCount(): Long = trackers.sumOf { it.modificationCount }
public companion object {
public fun create(trackers: List<ModificationTracker>): ModificationTracker = when (trackers.size) {
0 -> ModificationTracker.NEVER_CHANGED
1 -> trackers.single()
else -> CompositeModificationTracker(trackers)
public fun create(trackers: List<ModificationTracker>): ModificationTracker {
return when (trackers.size) {
0 -> ModificationTracker.NEVER_CHANGED
1 -> trackers.single()
else -> CompositeModificationTracker(trackers)
}
}
public fun createFlattened(trackers: List<ModificationTracker>): ModificationTracker {
val map = IdentityHashMap<ModificationTracker, Boolean>()
val flattened = ArrayList<ModificationTracker>()
fun flatten(tracker: ModificationTracker) {
when (tracker) {
is CompositeModificationTracker -> tracker.trackers.forEach(::flatten)
ModificationTracker.NEVER_CHANGED -> {}
else -> {
if (map.put(tracker, true) == null) {
flattened += tracker
}
}
}
}
trackers.forEach(::flatten)
return create(flattened)
}
}
}