diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesFileAttribute.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesFileAttribute.kt index af0fb9e9170..3dfc6071235 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesFileAttribute.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesFileAttribute.kt @@ -30,25 +30,23 @@ import kotlin.reflect.KProperty import kotlin.script.experimental.dependencies.ScriptDependencies var VirtualFile.scriptDependencies: ScriptDependencies? by ScriptDependenciesProperty() -private val scriptDependencies = FileAttribute("kotlin-script-dependencies", 3, false) +private val scriptDependencies = FileAttribute("kotlin-script-dependencies", 4, false) private class ScriptDependenciesProperty { operator fun setValue(file: VirtualFile, property: KProperty<*>, newValue: ScriptDependencies?) { if (file !is VirtualFileWithId) return - 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) + val output = scriptDependencies.writeAttribute(file) + output.use { + it.writeNullable(newValue) { value -> + with(value) { + writeFileList(classpath) + writeStringList(imports) + writeNullable(javaHome, DataOutput::writeFile) + writeFileList(scripts) + writeFileList(sources) - } } } } @@ -59,8 +57,8 @@ private class ScriptDependenciesProperty { val input = scriptDependencies.readAttribute(file) return input?.use { - with(input) { - return ScriptDependencies( + it.readNullable { + ScriptDependencies( classpath = readFileList(), imports = readStringList(), javaHome = readNullable(DataInput::readFile), diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt index 6cf8c88fe3e..ad8982e5557 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt @@ -208,7 +208,7 @@ class ScriptDependenciesUpdater( } ServiceManager.getService(project, ScriptReportSink::class.java)?.attachReports(file, result.reports) val resultingDependencies = result.dependencies?.adjustByDefinition(scriptDef) ?: return - if (saveNewDependencies(resultingDependencies, file)) { + if (saveNewDependencies(resultingDependencies, file, result.reports.any { it.severity == ScriptReport.Severity.FATAL })) { notifyRootsChanged() } } @@ -217,16 +217,22 @@ class ScriptDependenciesUpdater( fun updateSync(file: VirtualFile, scriptDef: KotlinScriptDefinition): Boolean { val result = contentLoader.loadContentsAndResolveDependencies(scriptDef, file) - if (result.reports.any { it.severity == ScriptReport.Severity.FATAL }) return false - val newDeps = result.dependencies?.adjustByDefinition(scriptDef) ?: ScriptDependencies.Empty - return saveNewDependencies(newDeps, file) + return saveNewDependencies(newDeps, file, result.reports.any { it.severity == ScriptReport.Severity.FATAL }) } - private fun saveNewDependencies(new: ScriptDependencies, file: VirtualFile): Boolean { + private fun saveNewDependencies( + new: ScriptDependencies, + file: VirtualFile, + hasFatalErrors: Boolean + ): Boolean { val rootsChanged = cache.hasNotCachedRoots(new) if (cache.save(file, new)) { - file.scriptDependencies = new + if (hasFatalErrors) { + file.scriptDependencies = null + } else { + file.scriptDependencies = new + } } return rootsChanged }