Reset scriptDependencies file attribute when dependencies update fails with fatal error

This commit is contained in:
Natalia Selezneva
2018-03-23 14:57:29 +03:00
parent 8d2f806c6b
commit 31266e49d0
2 changed files with 24 additions and 20 deletions
@@ -30,18 +30,17 @@ import kotlin.reflect.KProperty
import kotlin.script.experimental.dependencies.ScriptDependencies import kotlin.script.experimental.dependencies.ScriptDependencies
var VirtualFile.scriptDependencies: ScriptDependencies? by ScriptDependenciesProperty() 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 { private class ScriptDependenciesProperty {
operator fun setValue(file: VirtualFile, property: KProperty<*>, newValue: ScriptDependencies?) { operator fun setValue(file: VirtualFile, property: KProperty<*>, newValue: ScriptDependencies?) {
if (file !is VirtualFileWithId) return if (file !is VirtualFileWithId) return
if (newValue != null) {
val output = scriptDependencies.writeAttribute(file) val output = scriptDependencies.writeAttribute(file)
output.use { output.use {
with(newValue) { it.writeNullable(newValue) { value ->
with(output) { with(value) {
writeFileList(classpath) writeFileList(classpath)
writeStringList(imports) writeStringList(imports)
writeNullable(javaHome, DataOutput::writeFile) writeNullable(javaHome, DataOutput::writeFile)
@@ -52,15 +51,14 @@ private class ScriptDependenciesProperty {
} }
} }
} }
}
operator fun getValue(file: VirtualFile, property: KProperty<*>): ScriptDependencies? { operator fun getValue(file: VirtualFile, property: KProperty<*>): ScriptDependencies? {
if (file !is VirtualFileWithId) return null if (file !is VirtualFileWithId) return null
val input = scriptDependencies.readAttribute(file) val input = scriptDependencies.readAttribute(file)
return input?.use { return input?.use {
with(input) { it.readNullable {
return ScriptDependencies( ScriptDependencies(
classpath = readFileList(), classpath = readFileList(),
imports = readStringList(), imports = readStringList(),
javaHome = readNullable(DataInput::readFile), javaHome = readNullable(DataInput::readFile),
@@ -208,7 +208,7 @@ class ScriptDependenciesUpdater(
} }
ServiceManager.getService(project, ScriptReportSink::class.java)?.attachReports(file, result.reports) ServiceManager.getService(project, ScriptReportSink::class.java)?.attachReports(file, result.reports)
val resultingDependencies = result.dependencies?.adjustByDefinition(scriptDef) ?: return val resultingDependencies = result.dependencies?.adjustByDefinition(scriptDef) ?: return
if (saveNewDependencies(resultingDependencies, file)) { if (saveNewDependencies(resultingDependencies, file, result.reports.any { it.severity == ScriptReport.Severity.FATAL })) {
notifyRootsChanged() notifyRootsChanged()
} }
} }
@@ -217,17 +217,23 @@ class ScriptDependenciesUpdater(
fun updateSync(file: VirtualFile, scriptDef: KotlinScriptDefinition): Boolean { fun updateSync(file: VirtualFile, scriptDef: KotlinScriptDefinition): Boolean {
val result = contentLoader.loadContentsAndResolveDependencies(scriptDef, file) 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 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) val rootsChanged = cache.hasNotCachedRoots(new)
if (cache.save(file, new)) { if (cache.save(file, new)) {
if (hasFatalErrors) {
file.scriptDependencies = null
} else {
file.scriptDependencies = new file.scriptDependencies = new
} }
}
return rootsChanged return rootsChanged
} }