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,25 +30,23 @@ 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 { it.writeNullable(newValue) { value ->
with(newValue) { with(value) {
with(output) { writeFileList(classpath)
writeFileList(classpath) writeStringList(imports)
writeStringList(imports) writeNullable(javaHome, DataOutput::writeFile)
writeNullable(javaHome, DataOutput::writeFile) writeFileList(scripts)
writeFileList(scripts) writeFileList(sources)
writeFileList(sources)
}
} }
} }
} }
@@ -59,8 +57,8 @@ private class ScriptDependenciesProperty {
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,16 +217,22 @@ 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)) {
file.scriptDependencies = new if (hasFatalErrors) {
file.scriptDependencies = null
} else {
file.scriptDependencies = new
}
} }
return rootsChanged return rootsChanged
} }