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
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),
@@ -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
}