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 package org.jetbrains.kotlin.idea.core.script.configuration
import com.intellij.ProjectTopics
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.extensions.Extensions
import com.intellij.openapi.fileEditor.FileEditorManager import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.Sdk 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.openapi.vfs.VirtualFile
import com.intellij.psi.PsiElementFinder import com.intellij.psi.PsiElementFinder
import com.intellij.psi.PsiFile import com.intellij.psi.PsiFile
@@ -207,6 +210,15 @@ internal abstract class AbstractScriptConfigurationManager(
return classpathRoots.hasNotCachedRoots(configuration) 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 * Clear configuration caches
* Start re-highlighting for opened scripts * Start re-highlighting for opened scripts
@@ -261,11 +273,11 @@ internal abstract class AbstractScriptConfigurationManager(
} }
} }
private fun newClassRootsCache() = object : ScriptClassRootsCache(project) { private fun newClassRootsCache() =
override val all = cache.allApplied() object : ScriptClassRootsCache(project, cache.allApplied()) {
override fun getConfiguration(file: VirtualFile) = override fun getConfiguration(file: VirtualFile) =
this@AbstractScriptConfigurationManager.getConfiguration(file) this@AbstractScriptConfigurationManager.getConfiguration(file)
} }
private fun clearClassRootsCaches() { private fun clearClassRootsCaches() {
debug { "class roots caches cleared" } 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.idea.core.script.debug
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper
internal abstract class ScriptClassRootsCache(private val project: Project) { internal abstract class ScriptClassRootsCache(
protected abstract val all: Collection<Pair<VirtualFile, ScriptCompilationConfigurationWrapper>> private val project: Project,
val all: Collection<Pair<VirtualFile, ScriptCompilationConfigurationWrapper>>
) {
protected abstract fun getConfiguration(file: VirtualFile): ScriptCompilationConfigurationWrapper? protected abstract fun getConfiguration(file: VirtualFile): ScriptCompilationConfigurationWrapper?
private fun getScriptSdk(compilationConfiguration: ScriptCompilationConfigurationWrapper?): Sdk? { private fun getScriptSdk(compilationConfiguration: ScriptCompilationConfigurationWrapper?): Sdk? {