Change script definition lookup key from File to ScriptSource
to make it more generic and allow easier implementation fo the non-file based scripts.
This commit is contained in:
+20
-9
@@ -23,6 +23,7 @@ import com.intellij.openapi.projectRoots.ex.PathUtilEx
|
||||
import com.intellij.openapi.roots.ProjectRootManager
|
||||
import com.intellij.openapi.vfs.VfsUtil
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.intellij.openapi.vfs.VirtualFileManager
|
||||
import com.intellij.util.containers.SLRUMap
|
||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||
import org.jetbrains.kotlin.idea.caches.project.SdkInfo
|
||||
@@ -31,6 +32,7 @@ import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings
|
||||
import org.jetbrains.kotlin.idea.util.getProjectJdkTableSafe
|
||||
import org.jetbrains.kotlin.script.ScriptTemplatesProvider
|
||||
import org.jetbrains.kotlin.scripting.definitions.*
|
||||
import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource
|
||||
import org.jetbrains.kotlin.utils.PathUtil
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.flattenTo
|
||||
@@ -41,11 +43,13 @@ import kotlin.concurrent.withLock
|
||||
import kotlin.concurrent.write
|
||||
import kotlin.script.dependencies.Environment
|
||||
import kotlin.script.dependencies.ScriptContents
|
||||
import kotlin.script.experimental.api.SourceCode
|
||||
import kotlin.script.experimental.dependencies.DependenciesResolver
|
||||
import kotlin.script.experimental.dependencies.ScriptDependencies
|
||||
import kotlin.script.experimental.dependencies.asSuccess
|
||||
import kotlin.script.experimental.host.ScriptingHostConfiguration
|
||||
import kotlin.script.experimental.host.configurationDependencies
|
||||
import kotlin.script.experimental.host.toScriptSource
|
||||
import kotlin.script.experimental.jvm.JvmDependency
|
||||
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
|
||||
import kotlin.script.experimental.jvm.util.scriptCompilationClasspathFromContextOrStdlib
|
||||
@@ -58,32 +62,39 @@ class ScriptDefinitionsManager(private val project: Project) : LazyScriptDefinit
|
||||
private val failedContributorsHashes = HashSet<Int>()
|
||||
|
||||
private val scriptDefinitionsCacheLock = ReentrantLock()
|
||||
private val scriptDefinitionsCache = SLRUMap<File, ScriptDefinition>(10, 10)
|
||||
private val scriptDefinitionsCache = SLRUMap<String, ScriptDefinition>(10, 10)
|
||||
|
||||
override fun findDefinition(file: File): ScriptDefinition? {
|
||||
if (nonScriptFileName(file.name)) return null
|
||||
override fun findDefinition(script: SourceCode): ScriptDefinition? {
|
||||
val locationId = script.locationId ?: return null
|
||||
if (nonScriptId(locationId)) return null
|
||||
if (!isReady()) return null
|
||||
|
||||
val cached = scriptDefinitionsCacheLock.withLock { scriptDefinitionsCache.get(file) }
|
||||
val cached = scriptDefinitionsCacheLock.withLock { scriptDefinitionsCache.get(locationId) }
|
||||
if (cached != null) return cached
|
||||
|
||||
val virtualFile = VfsUtil.findFileByIoFile(file, true)
|
||||
val definition =
|
||||
if (virtualFile != null && ScratchFileService.getInstance().getRootType(virtualFile) is ScratchRootType) {
|
||||
if (isScratchFile(script)) {
|
||||
// Scratch should always have default script definition
|
||||
getDefaultDefinition()
|
||||
} else {
|
||||
super.findDefinition(file) ?: return null
|
||||
super.findDefinition(script) ?: return null
|
||||
}
|
||||
|
||||
scriptDefinitionsCacheLock.withLock {
|
||||
scriptDefinitionsCache.put(file, definition)
|
||||
scriptDefinitionsCache.put(locationId, definition)
|
||||
}
|
||||
|
||||
return definition
|
||||
}
|
||||
|
||||
override fun findScriptDefinition(fileName: String): KotlinScriptDefinition? = findDefinition(File(fileName))?.legacyDefinition
|
||||
private fun isScratchFile(script: SourceCode): Boolean {
|
||||
val virtualFile =
|
||||
if (script is VirtualFileScriptSource) script.virtualFile
|
||||
else script.locationId?.let { VirtualFileManager.getInstance().findFileByUrl(it) }
|
||||
return virtualFile != null && ScratchFileService.getInstance().getRootType(virtualFile) is ScratchRootType
|
||||
}
|
||||
|
||||
override fun findScriptDefinition(fileName: String): KotlinScriptDefinition? = findDefinition(File(fileName).toScriptSource())?.legacyDefinition
|
||||
|
||||
fun reloadDefinitionsBy(source: ScriptDefinitionsSource) = lock.write {
|
||||
if (definitions == null) return // not loaded yet
|
||||
|
||||
Reference in New Issue
Block a user