Scripting: invalidate caches on roots changes

This commit is contained in:
Sergey Rostov
2019-11-13 17:36:55 +03:00
parent df0c250fd8
commit b757224df1
2 changed files with 21 additions and 7 deletions
@@ -5,11 +5,14 @@
package org.jetbrains.kotlin.idea.core.script.configuration
import com.intellij.ProjectTopics
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
import com.intellij.openapi.extensions.Extensions
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.ModuleRootEvent
import com.intellij.openapi.roots.ModuleRootListener
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiElementFinder
import com.intellij.psi.PsiFile
@@ -207,6 +210,15 @@ internal abstract class AbstractScriptConfigurationManager(
return classpathRoots.hasNotCachedRoots(configuration)
}
init {
val connection = project.messageBus.connect()
connection.subscribe(ProjectTopics.PROJECT_ROOTS, object : ModuleRootListener {
override fun rootsChanged(event: ModuleRootEvent) {
clearClassRootsCaches()
}
})
}
/**
* Clear configuration caches
* Start re-highlighting for opened scripts
@@ -261,11 +273,11 @@ internal abstract class AbstractScriptConfigurationManager(
}
}
private fun newClassRootsCache() = object : ScriptClassRootsCache(project) {
override val all = cache.allApplied()
override fun getConfiguration(file: VirtualFile) =
this@AbstractScriptConfigurationManager.getConfiguration(file)
}
private fun newClassRootsCache() =
object : ScriptClassRootsCache(project, cache.allApplied()) {
override fun getConfiguration(file: VirtualFile) =
this@AbstractScriptConfigurationManager.getConfiguration(file)
}
private fun clearClassRootsCaches() {
debug { "class roots caches cleared" }
@@ -20,8 +20,10 @@ import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager
import org.jetbrains.kotlin.idea.core.script.debug
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper
internal abstract class ScriptClassRootsCache(private val project: Project) {
protected abstract val all: Collection<Pair<VirtualFile, ScriptCompilationConfigurationWrapper>>
internal abstract class ScriptClassRootsCache(
private val project: Project,
val all: Collection<Pair<VirtualFile, ScriptCompilationConfigurationWrapper>>
) {
protected abstract fun getConfiguration(file: VirtualFile): ScriptCompilationConfigurationWrapper?
private fun getScriptSdk(compilationConfiguration: ScriptCompilationConfigurationWrapper?): Sdk? {