Do not highlight kts files outside source roots if not all definitions are initialized
^KT-20521 Fixed ^KT-21420 Fixed
This commit is contained in:
+15
-1
@@ -46,6 +46,9 @@ class ScriptDefinitionsManager(private val project: Project): ScriptDefinitionPr
|
||||
private var definitionsByContributor = mutableMapOf<ScriptDefinitionContributor, List<KotlinScriptDefinition>>()
|
||||
private var definitions: List<KotlinScriptDefinition> = emptyList()
|
||||
|
||||
var hasFailedDefinitions = false
|
||||
private set
|
||||
|
||||
fun reloadDefinitionsBy(contributor: ScriptDefinitionContributor) = lock.write {
|
||||
val notLoadedYet = definitions.isEmpty()
|
||||
if (notLoadedYet) return
|
||||
@@ -53,6 +56,9 @@ class ScriptDefinitionsManager(private val project: Project): ScriptDefinitionPr
|
||||
if (contributor !in definitionsByContributor) error("Unknown contributor: ${contributor.id}")
|
||||
|
||||
definitionsByContributor[contributor] = contributor.safeGetDefinitions()
|
||||
|
||||
hasFailedDefinitions = getContributors().any { it.isError() }
|
||||
|
||||
updateDefinitions()
|
||||
}
|
||||
|
||||
@@ -84,7 +90,13 @@ class ScriptDefinitionsManager(private val project: Project): ScriptDefinitionPr
|
||||
}
|
||||
|
||||
fun reloadScriptDefinitions() = lock.write {
|
||||
definitionsByContributor = getContributors().associateByTo(mutableMapOf(), { it }, { it.safeGetDefinitions() })
|
||||
for (contributor in getContributors()) {
|
||||
val definitions = contributor.safeGetDefinitions()
|
||||
definitionsByContributor[contributor] = definitions
|
||||
}
|
||||
|
||||
hasFailedDefinitions = getContributors().any { it.isError() }
|
||||
|
||||
updateDefinitions()
|
||||
}
|
||||
|
||||
@@ -148,6 +160,8 @@ interface ScriptDefinitionContributor {
|
||||
|
||||
fun getDefinitions(): List<KotlinScriptDefinition>
|
||||
|
||||
fun isError(): Boolean = false
|
||||
|
||||
companion object {
|
||||
val EP_NAME: ExtensionPointName<ScriptDefinitionContributor> =
|
||||
ExtensionPointName.create<ScriptDefinitionContributor>("org.jetbrains.kotlin.scriptDefinitionContributor")
|
||||
|
||||
+27
-41
@@ -16,72 +16,58 @@
|
||||
|
||||
package org.jetbrains.kotlin.idea.core.script
|
||||
|
||||
import com.intellij.openapi.components.ServiceManager
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.intellij.openapi.vfs.VirtualFileWithId
|
||||
import com.intellij.openapi.vfs.newvfs.FileAttribute
|
||||
import com.intellij.util.io.DataInputOutputUtil.readSeq
|
||||
import com.intellij.util.io.DataInputOutputUtil.writeSeq
|
||||
import com.intellij.util.io.IOUtil.readUTF
|
||||
import com.intellij.util.io.IOUtil.writeUTF
|
||||
import org.jetbrains.kotlin.idea.caches.FileAttributeService
|
||||
import java.io.DataInput
|
||||
import java.io.DataOutput
|
||||
import java.io.File
|
||||
import kotlin.reflect.KProperty
|
||||
import kotlin.script.experimental.dependencies.ScriptDependencies
|
||||
|
||||
object ScriptDependenciesFileAttribute {
|
||||
private val VERSION = 1
|
||||
private val ID = "kotlin-script-dependencies"
|
||||
var VirtualFile.scriptDependencies: ScriptDependencies? by ScriptDependenciesProperty()
|
||||
private val scriptDependencies = FileAttribute("kotlin-script-dependencies", 2, false)
|
||||
|
||||
private val fileAttributeService = ServiceManager.getService(FileAttributeService::class.java)
|
||||
private class ScriptDependenciesProperty {
|
||||
|
||||
init {
|
||||
fileAttributeService.register(ID, VERSION, false)
|
||||
}
|
||||
operator fun setValue(file: VirtualFile, property: KProperty<*>, newValue: ScriptDependencies?) {
|
||||
if (file !is VirtualFileWithId) return
|
||||
|
||||
fun write(virtualFile: VirtualFile, dependencies: ScriptDependencies) {
|
||||
if (virtualFile !is VirtualFileWithId) return
|
||||
fileAttributeService.write(virtualFile, ID, dependencies) { output, dep ->
|
||||
with(dep) {
|
||||
output.writeInt(VERSION)
|
||||
if (newValue != null) {
|
||||
val output = scriptDependencies.writeAttribute(file)
|
||||
output.use {
|
||||
with(newValue) {
|
||||
with(output) {
|
||||
writeFileList(classpath)
|
||||
writeStringList(imports)
|
||||
writeNullable(javaHome, DataOutput::writeFile)
|
||||
writeFileList(scripts)
|
||||
writeFileList(sources)
|
||||
|
||||
writeDependencies(this, output)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun read(virtualFile: VirtualFile): ScriptDependencies? {
|
||||
if (virtualFile !is VirtualFileWithId) return null
|
||||
operator fun getValue(file: VirtualFile, property: KProperty<*>): ScriptDependencies? {
|
||||
if (file !is VirtualFileWithId) return null
|
||||
|
||||
return fileAttributeService.read(virtualFile, ID) { input ->
|
||||
val version = input.readInt()
|
||||
if (version != VERSION) null
|
||||
else readDependencies(input)
|
||||
}?.value
|
||||
}
|
||||
|
||||
private fun writeDependencies(scriptDependencies: ScriptDependencies, output: DataOutput) {
|
||||
with(scriptDependencies) {
|
||||
with(output) {
|
||||
writeFileList(classpath)
|
||||
writeStringList(imports)
|
||||
writeNullable(javaHome, DataOutput::writeFile)
|
||||
writeFileList(scripts)
|
||||
writeFileList(sources)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun readDependencies(input: DataInput): ScriptDependencies {
|
||||
with(input) {
|
||||
return ScriptDependencies(
|
||||
val input = scriptDependencies.readAttribute(file)
|
||||
return input?.use {
|
||||
with(input) {
|
||||
return ScriptDependencies(
|
||||
classpath = readFileList(),
|
||||
imports = readStringList(),
|
||||
javaHome = readNullable(DataInput::readFile),
|
||||
scripts = readFileList(),
|
||||
sources = readFileList()
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+7
-2
@@ -37,6 +37,7 @@ import org.jetbrains.annotations.TestOnly
|
||||
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
|
||||
import org.jetbrains.kotlin.idea.core.util.EDT
|
||||
import org.jetbrains.kotlin.idea.core.util.cancelOnDisposal
|
||||
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
|
||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||
import org.jetbrains.kotlin.psi.NotNullableUserDataProperty
|
||||
import org.jetbrains.kotlin.script.*
|
||||
@@ -93,7 +94,7 @@ class ScriptDependenciesUpdater(
|
||||
}
|
||||
|
||||
private fun tryLoadingFromDisk(file: VirtualFile): Boolean {
|
||||
val deserializedDependencies = ScriptDependenciesFileAttribute.read(file) ?: return false
|
||||
val deserializedDependencies = file.scriptDependencies ?: return false
|
||||
saveToCache(deserializedDependencies, file)
|
||||
return true
|
||||
}
|
||||
@@ -117,6 +118,10 @@ class ScriptDependenciesUpdater(
|
||||
}
|
||||
|
||||
private fun performUpdate(file: VirtualFile) {
|
||||
if (ScriptDefinitionsManager.getInstance(project).hasFailedDefinitions && !ProjectRootsUtil.isProjectSourceFile(project, file)) {
|
||||
return
|
||||
}
|
||||
|
||||
val scriptDef = scriptDefinitionProvider.findScriptDefinition(file) ?: return
|
||||
when (scriptDef.dependencyResolver) {
|
||||
is AsyncDependenciesResolver, is LegacyResolverWrapper -> {
|
||||
@@ -221,7 +226,7 @@ class ScriptDependenciesUpdater(
|
||||
): Boolean {
|
||||
val rootsChanged = cache.hasNotCachedRoots(new)
|
||||
if (cache.save(file, new)) {
|
||||
ScriptDependenciesFileAttribute.write(file, new)
|
||||
file.scriptDependencies = new
|
||||
}
|
||||
return rootsChanged
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user