[LL FIR] incrementally update module caches

This commit is contained in:
Ilya Kirillov
2022-07-24 12:59:17 +02:00
parent b9e2173288
commit 91cf194a94
8 changed files with 188 additions and 84 deletions
@@ -9,6 +9,7 @@ import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.ModificationTracker
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
@@ -62,10 +63,40 @@ public abstract class KotlinModificationTrackerFactory {
* See [KotlinModificationTrackerFactory] for the definition of **OOBM**.
* @see ModificationTracker
*/
public abstract fun createLibrariesModificationTracker(): ModificationTracker
public abstract fun createLibrariesWideModificationTracker(): ModificationTracker
/**
* Creates [KtModuleStateTracker] which is incremented every time [module] roots changes.
*
* @see KtModuleStateTracker
*/
public abstract fun createModuleStateTracker(module: KtModule): KtModuleStateTracker
@TestOnly
public abstract fun incrementModificationsCount()
public companion object {
public fun getService(project: Project): KotlinModificationTrackerFactory =
project.getService(KotlinModificationTrackerFactory::class.java)
}
}
/**
* Represents current state of [KtModule] validity, can be created via [org.jetbrains.kotlin.analysis.providers.KotlinModificationTrackerFactory.createModuleStateTracker]
*/
public interface KtModuleStateTracker {
/**
* If the module is still valid (i.e., it was not removed)
*/
public val isValid: Boolean
/**
* Represents modification tracker of modified roots similar to the [ModificationTracker].
*
* If the [isValid] == `false`, when behaviour is unspecified
*/
public val rootModificationCount: Long
}
/**
@@ -94,6 +125,6 @@ public fun KtSourceModule.createModuleWithoutDependenciesOutOfBlockModificationT
* See [KotlinModificationTrackerFactory] for the definition of **OOBM**.
* @see ModificationTracker
*/
public fun Project.createLibrariesModificationTracker(): ModificationTracker =
public fun Project.createAllLibrariesModificationTracker(): ModificationTracker =
ServiceManager.getService(this, KotlinModificationTrackerFactory::class.java)
.createLibrariesModificationTracker()
.createLibrariesWideModificationTracker()
@@ -8,13 +8,17 @@ package org.jetbrains.kotlin.analysis.providers.impl
import com.intellij.openapi.util.ModificationTracker
import com.intellij.openapi.util.SimpleModificationTracker
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
import org.jetbrains.kotlin.analysis.providers.KotlinModificationTrackerFactory
import org.jetbrains.kotlin.analysis.providers.KtModuleStateTracker
public class KotlinStaticModificationTrackerFactory : KotlinModificationTrackerFactory() {
private val projectWide = SimpleModificationTracker()
private val library = SimpleModificationTracker()
private val forModule = mutableMapOf<KtSourceModule, SimpleModificationTracker>()
private val librariesWide = SimpleModificationTracker()
private val moduleOutOfBlock = mutableMapOf<KtSourceModule, SimpleModificationTracker>()
private val moduleState = mutableMapOf<KtModule, KtModuleStateTrackerImpl>()
override fun createProjectWideOutOfBlockModificationTracker(): ModificationTracker {
return projectWide
@@ -22,17 +26,35 @@ public class KotlinStaticModificationTrackerFactory : KotlinModificationTrackerF
override fun createModuleWithoutDependenciesOutOfBlockModificationTracker(module: KtSourceModule): ModificationTracker {
return forModule.getOrPut(module) { SimpleModificationTracker() }
return moduleOutOfBlock.getOrPut(module) { SimpleModificationTracker() }
}
override fun createLibrariesModificationTracker(): ModificationTracker {
return library
override fun createLibrariesWideModificationTracker(): ModificationTracker {
return librariesWide
}
override fun createModuleStateTracker(module: KtModule): KtModuleStateTracker {
return moduleState.getOrPut(module) { KtModuleStateTrackerImpl() }
}
@TestOnly
override fun incrementModificationsCount() {
projectWide.incModificationCount()
library.incModificationCount()
forModule.values.forEach { it.incModificationCount() }
librariesWide.incModificationCount()
moduleOutOfBlock.values.forEach { it.incModificationCount() }
moduleState.values.forEach { it.incModificationCount() }
}
}
private class KtModuleStateTrackerImpl: KtModuleStateTracker {
override val isValid: Boolean get() = true
private var _rootModificationCount = 0L
override val rootModificationCount: Long get() = _rootModificationCount
@TestOnly
fun incModificationCount() {
_rootModificationCount++
}
}