Implement quick non-script detection and lazy script discovery..
so ".kt" and ".java" files are not considered as scripts and quickly filtered out, and for the other files the the checks are implemented using sequences, mechanisms provided to supply script definitions lazily, and script discovery is implemented using this mechanisms.
This commit is contained in:
+14
-14
@@ -16,24 +16,15 @@
|
||||
|
||||
package org.jetbrains.kotlin.cli.common.script
|
||||
|
||||
import org.jetbrains.kotlin.script.KotlinScriptDefinition
|
||||
import org.jetbrains.kotlin.script.ScriptDefinitionProvider
|
||||
import org.jetbrains.kotlin.script.StandardScriptDefinition
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock
|
||||
import kotlin.concurrent.read
|
||||
import org.jetbrains.kotlin.script.*
|
||||
import kotlin.concurrent.write
|
||||
|
||||
class CliScriptDefinitionProvider : ScriptDefinitionProvider {
|
||||
class CliScriptDefinitionProvider : LazyScriptDefinitionProvider() {
|
||||
private val definitionsFromSources: MutableList<Sequence<KotlinScriptDefinition>> = arrayListOf()
|
||||
private val definitions: MutableList<KotlinScriptDefinition> = arrayListOf(StandardScriptDefinition)
|
||||
private val lock = ReentrantReadWriteLock()
|
||||
|
||||
override fun findScriptDefinition(fileName: String) = lock.read {
|
||||
definitions.firstOrNull { it.isScript(fileName) }
|
||||
}
|
||||
|
||||
override fun isScript(fileName: String) = lock.read {
|
||||
definitions.any { it.isScript(fileName) }
|
||||
}
|
||||
override val currentDefinitions: Sequence<KotlinScriptDefinition> =
|
||||
definitionsFromSources.asSequence().flatMap { it } + definitions.asSequence()
|
||||
|
||||
fun setScriptDefinitions(newDefinitions: List<KotlinScriptDefinition>) {
|
||||
lock.write {
|
||||
@@ -41,4 +32,13 @@ class CliScriptDefinitionProvider : ScriptDefinitionProvider {
|
||||
definitions.addAll(newDefinitions)
|
||||
}
|
||||
}
|
||||
|
||||
fun setScriptDefinitionsSources(newSources: List<ScriptDefinitionsSource>) {
|
||||
lock.write {
|
||||
definitionsFromSources.clear()
|
||||
for (it in newSources) {
|
||||
definitionsFromSources.add(it.definitions.constrainOnce())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-4
@@ -19,10 +19,8 @@ package org.jetbrains.kotlin.cli.common.script
|
||||
import com.intellij.openapi.diagnostic.Logger
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import org.jetbrains.kotlin.script.ScriptContentLoader
|
||||
import org.jetbrains.kotlin.script.ScriptDefinitionProvider
|
||||
import org.jetbrains.kotlin.script.ScriptDependenciesProvider
|
||||
import org.jetbrains.kotlin.script.adjustByDefinition
|
||||
import org.jetbrains.kotlin.script.findScriptDefinition
|
||||
import org.jetbrains.kotlin.script.*
|
||||
import java.io.File
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock
|
||||
import kotlin.concurrent.read
|
||||
|
||||
@@ -209,6 +209,9 @@ class KotlinCoreEnvironment private constructor(
|
||||
|
||||
val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) as? CliScriptDefinitionProvider
|
||||
if (scriptDefinitionProvider != null) {
|
||||
scriptDefinitionProvider.setScriptDefinitionsSources(
|
||||
configuration.getList(JVMConfigurationKeys.SCRIPT_DEFINITIONS_SOURCES)
|
||||
)
|
||||
scriptDefinitionProvider.setScriptDefinitions(
|
||||
configuration.getList(JVMConfigurationKeys.SCRIPT_DEFINITIONS))
|
||||
|
||||
|
||||
@@ -210,6 +210,9 @@ class KotlinCoreEnvironment private constructor(
|
||||
|
||||
val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) as? CliScriptDefinitionProvider
|
||||
if (scriptDefinitionProvider != null) {
|
||||
scriptDefinitionProvider.setScriptDefinitionsSources(
|
||||
configuration.getList(JVMConfigurationKeys.SCRIPT_DEFINITIONS_SOURCES)
|
||||
)
|
||||
scriptDefinitionProvider.setScriptDefinitions(
|
||||
configuration.getList(JVMConfigurationKeys.SCRIPT_DEFINITIONS))
|
||||
|
||||
|
||||
@@ -212,6 +212,9 @@ class KotlinCoreEnvironment private constructor(
|
||||
|
||||
val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) as? CliScriptDefinitionProvider
|
||||
if (scriptDefinitionProvider != null) {
|
||||
scriptDefinitionProvider.setScriptDefinitionsSources(
|
||||
configuration.getList(JVMConfigurationKeys.SCRIPT_DEFINITIONS_SOURCES)
|
||||
)
|
||||
scriptDefinitionProvider.setScriptDefinitions(
|
||||
configuration.getList(JVMConfigurationKeys.SCRIPT_DEFINITIONS))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user