Refactoring: move ScriptBinariesScopeCache to ScriptDependenciesCache
This commit is contained in:
+4
-18
@@ -5,20 +5,15 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.caches.project
|
package org.jetbrains.kotlin.idea.caches.project
|
||||||
|
|
||||||
import com.intellij.openapi.components.ServiceManager
|
|
||||||
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.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import com.intellij.psi.search.NonClasspathDirectoriesScope
|
|
||||||
import com.intellij.util.containers.SLRUCache
|
|
||||||
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesCache.Companion.MAX_SCRIPTS_CACHED
|
|
||||||
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager
|
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager
|
||||||
import org.jetbrains.kotlin.idea.core.script.dependencies.ScriptAdditionalIdeaDependenciesProvider
|
import org.jetbrains.kotlin.idea.core.script.dependencies.ScriptAdditionalIdeaDependenciesProvider
|
||||||
import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope
|
import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition
|
import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition
|
||||||
import kotlin.script.experimental.dependencies.ScriptDependencies
|
|
||||||
|
|
||||||
data class ScriptModuleInfo(
|
data class ScriptModuleInfo(
|
||||||
val project: Project,
|
val project: Project,
|
||||||
@@ -76,9 +71,6 @@ sealed class ScriptDependenciesInfo(val project: Project) : IdeaModuleInfo, Bina
|
|||||||
val scriptFile: VirtualFile,
|
val scriptFile: VirtualFile,
|
||||||
val scriptDefinition: KotlinScriptDefinition
|
val scriptDefinition: KotlinScriptDefinition
|
||||||
) : ScriptDependenciesInfo(project) {
|
) : ScriptDependenciesInfo(project) {
|
||||||
private val externalDependencies: ScriptDependencies
|
|
||||||
get() = ScriptDependenciesManager.getInstance(project).getScriptDependencies(scriptFile)
|
|
||||||
|
|
||||||
override val sdk: Sdk?
|
override val sdk: Sdk?
|
||||||
get() {
|
get() {
|
||||||
val manager = ScriptDependenciesManager.getInstance(project)
|
val manager = ScriptDependenciesManager.getInstance(project)
|
||||||
@@ -86,7 +78,10 @@ sealed class ScriptDependenciesInfo(val project: Project) : IdeaModuleInfo, Bina
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun contentScope(): GlobalSearchScope {
|
override fun contentScope(): GlobalSearchScope {
|
||||||
return ServiceManager.getService(project, ScriptBinariesScopeCache::class.java).get(externalDependencies)
|
// TODO: this is not very efficient because KotlinSourceFilterScope already checks if the files are in scripts classpath
|
||||||
|
return KotlinSourceFilterScope.libraryClassFiles(
|
||||||
|
ScriptDependenciesManager.getInstance(project).getScriptDependenciesClassFilesScope(scriptFile), project
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,13 +113,4 @@ sealed class ScriptDependenciesSourceInfo(val project: Project) : IdeaModuleInfo
|
|||||||
override fun equals(other: Any?): Boolean = other is ScriptDependenciesSourceInfo && this.project == other.project
|
override fun equals(other: Any?): Boolean = other is ScriptDependenciesSourceInfo && this.project == other.project
|
||||||
|
|
||||||
class ForProject(project: Project) : ScriptDependenciesSourceInfo(project)
|
class ForProject(project: Project) : ScriptDependenciesSourceInfo(project)
|
||||||
}
|
|
||||||
|
|
||||||
private class ScriptBinariesScopeCache(private val project: Project) : SLRUCache<ScriptDependencies, GlobalSearchScope>(MAX_SCRIPTS_CACHED, MAX_SCRIPTS_CACHED) {
|
|
||||||
override fun createValue(key: ScriptDependencies?): GlobalSearchScope {
|
|
||||||
val roots = key?.classpath ?: emptyList()
|
|
||||||
val classpath = ScriptDependenciesManager.toVfsRoots(roots)
|
|
||||||
// TODO: this is not very efficient because KotlinSourceFilterScope already checks if the files are in scripts classpath
|
|
||||||
return KotlinSourceFilterScope.libraryClassFiles(NonClasspathDirectoriesScope(classpath), project)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -22,6 +22,7 @@ import com.intellij.openapi.project.Project
|
|||||||
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.PsiManager
|
import com.intellij.psi.PsiManager
|
||||||
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import com.intellij.psi.search.NonClasspathDirectoriesScope
|
import com.intellij.psi.search.NonClasspathDirectoriesScope
|
||||||
import com.intellij.util.containers.SLRUMap
|
import com.intellij.util.containers.SLRUMap
|
||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.GlobalScope
|
||||||
@@ -52,6 +53,16 @@ class ScriptDependenciesCache(private val project: Project) {
|
|||||||
return scriptsModificationStampsCache.replace(file, file.modificationStamp) != file.modificationStamp
|
return scriptsModificationStampsCache.replace(file, file.modificationStamp) != file.modificationStamp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val scriptsDependenciesClasspathScopeCache = SLRUCacheWithLock<GlobalSearchScope>()
|
||||||
|
|
||||||
|
fun scriptDependenciesClasspathScope(file: VirtualFile): GlobalSearchScope {
|
||||||
|
return scriptsDependenciesClasspathScopeCache.getOrPut(file) {
|
||||||
|
val dependencies = scriptDependenciesCache.get(file)
|
||||||
|
val roots = dependencies?.classpath ?: emptyList()
|
||||||
|
NonClasspathDirectoriesScope.compose(ScriptDependenciesManager.toVfsRoots(roots))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val allScriptsClasspath by ClearableLazyValue(cacheLock) {
|
val allScriptsClasspath by ClearableLazyValue(cacheLock) {
|
||||||
val files = scriptDependenciesCache.getAll().flatMap { it.value.classpath }.distinct()
|
val files = scriptDependenciesCache.getAll().flatMap { it.value.classpath }.distinct()
|
||||||
ScriptDependenciesManager.toVfsRoots(files)
|
ScriptDependenciesManager.toVfsRoots(files)
|
||||||
@@ -75,6 +86,8 @@ class ScriptDependenciesCache(private val project: Project) {
|
|||||||
this::allLibrarySources.clearValue()
|
this::allLibrarySources.clearValue()
|
||||||
this::allLibrarySourcesScope.clearValue()
|
this::allLibrarySourcesScope.clearValue()
|
||||||
|
|
||||||
|
scriptsDependenciesClasspathScopeCache.clear()
|
||||||
|
|
||||||
val kotlinScriptDependenciesClassFinder =
|
val kotlinScriptDependenciesClassFinder =
|
||||||
Extensions.getArea(project).getExtensionPoint(PsiElementFinder.EP_NAME).extensions
|
Extensions.getArea(project).getExtensionPoint(PsiElementFinder.EP_NAME).extensions
|
||||||
.filterIsInstance<KotlinScriptDependenciesClassFinder>()
|
.filterIsInstance<KotlinScriptDependenciesClassFinder>()
|
||||||
@@ -169,6 +182,17 @@ private class SLRUCacheWithLock<T> {
|
|||||||
cache[value]
|
cache[value]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getOrPut(key: VirtualFile, defaultValue: () -> T): T = lock.write {
|
||||||
|
val value = cache.get(key)
|
||||||
|
return if (value == null) {
|
||||||
|
val answer = defaultValue()
|
||||||
|
replace(key, answer)
|
||||||
|
answer
|
||||||
|
} else {
|
||||||
|
value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun remove(file: VirtualFile) = lock.write {
|
fun remove(file: VirtualFile) = lock.write {
|
||||||
cache.remove(file)
|
cache.remove(file)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ class ScriptDependenciesManager internal constructor(
|
|||||||
fun getScriptDependencies(file: VirtualFile): ScriptDependencies = cacheUpdater.getCurrentDependencies(file)
|
fun getScriptDependencies(file: VirtualFile): ScriptDependencies = cacheUpdater.getCurrentDependencies(file)
|
||||||
fun getScriptSdk(file: VirtualFile): Sdk? = getScriptSdk(getScriptDependencies(file))
|
fun getScriptSdk(file: VirtualFile): Sdk? = getScriptSdk(getScriptDependencies(file))
|
||||||
|
|
||||||
|
fun getScriptDependenciesClassFilesScope(file: VirtualFile) = cache.scriptDependenciesClasspathScope(file)
|
||||||
|
|
||||||
fun getAllScriptsClasspathScope() = cache.allScriptsClasspathScope
|
fun getAllScriptsClasspathScope() = cache.allScriptsClasspathScope
|
||||||
fun getAllLibrarySourcesScope() = cache.allLibrarySourcesScope
|
fun getAllLibrarySourcesScope() = cache.allLibrarySourcesScope
|
||||||
fun getAllLibrarySources() = cache.allLibrarySources
|
fun getAllLibrarySources() = cache.allLibrarySources
|
||||||
|
|||||||
Reference in New Issue
Block a user