[LL FIR] incrementally update module caches
This commit is contained in:
+34
-3
@@ -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()
|
||||
|
||||
+29
-7
@@ -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++
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user