LastModifiedFiles: fix in case of sequential changes in same file

This commit is contained in:
Sergey Rostov
2020-05-06 18:43:08 +03:00
parent 39c6efd40f
commit 3ba7c52fe8
2 changed files with 85 additions and 4 deletions
@@ -11,10 +11,6 @@ import org.jetbrains.kotlin.idea.core.util.readNullable
import org.jetbrains.kotlin.idea.core.util.readStringList
import org.jetbrains.kotlin.idea.core.util.writeNullable
import org.jetbrains.kotlin.idea.core.util.writeStringList
import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootData
import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootDataSerializer
import org.jetbrains.kotlin.idea.scripting.gradle.roots.readKotlinDslScriptModels
import org.jetbrains.kotlin.idea.scripting.gradle.roots.writeKotlinDslScriptModels
import java.io.DataInputStream
import java.io.DataOutput
@@ -31,6 +27,11 @@ class LastModifiedFiles(
private var last: SimultaneouslyChangedFiles = SimultaneouslyChangedFiles(),
private var previous: SimultaneouslyChangedFiles = SimultaneouslyChangedFiles()
) {
init {
previous.fileIds.removeAll(last.fileIds)
if (previous.fileIds.isEmpty()) previous = SimultaneouslyChangedFiles()
}
class SimultaneouslyChangedFiles(
val ts: Long = Long.MIN_VALUE,
val fileIds: MutableSet<String> = mutableSetOf()
@@ -40,7 +41,10 @@ class LastModifiedFiles(
fun fileChanged(ts: Long, fileId: String) {
when {
ts > last.ts -> {
val prevPrev = previous
previous = last
previous.fileIds.remove(fileId)
if (previous.fileIds.isEmpty()) previous = prevPrev
last = SimultaneouslyChangedFiles(ts, hashSetOf(fileId))
}
ts == last.ts -> last.fileIds.add(fileId)
@@ -72,4 +72,81 @@ class LastModifiedFilesTest {
assertEquals(3, files.lastModifiedTimeStampExcept("a"))
assertEquals(3, files.lastModifiedTimeStampExcept("b"))
}
@Test
fun testSameFile() {
files.fileChanged(1, "x")
files.fileChanged(2, "x")
assertEquals(Long.MIN_VALUE, files.lastModifiedTimeStampExcept("x"))
}
@Test
fun testSameFile1() {
files.fileChanged(1, "z")
files.fileChanged(2, "x")
files.fileChanged(3, "x")
assertEquals(1, files.lastModifiedTimeStampExcept("x"))
assertEquals(3, files.lastModifiedTimeStampExcept("z"))
}
@Test
fun testSameFile2() {
files.fileChanged(1, "z")
files.fileChanged(1, "x")
files.fileChanged(2, "x")
assertEquals(1, files.lastModifiedTimeStampExcept("x"))
assertEquals(2, files.lastModifiedTimeStampExcept("z"))
}
@Test
fun testSameFile3() {
files.fileChanged(1, "x")
files.fileChanged(1, "y")
files.fileChanged(2, "x")
assertEquals(1, files.lastModifiedTimeStampExcept("x"))
assertEquals(2, files.lastModifiedTimeStampExcept("y"))
}
@Test
fun testSameFile4() {
files.fileChanged(1, "z")
files.fileChanged(2, "x")
files.fileChanged(2, "y")
files.fileChanged(3, "x")
assertEquals(2, files.lastModifiedTimeStampExcept("x"))
assertEquals(3, files.lastModifiedTimeStampExcept("y"))
assertEquals(3, files.lastModifiedTimeStampExcept("z"))
}
@Test
fun testLoadingAfterSameFileBug() {
val restored = LastModifiedFiles(
LastModifiedFiles.SimultaneouslyChangedFiles(2, mutableSetOf("x")),
LastModifiedFiles.SimultaneouslyChangedFiles(1, mutableSetOf("x"))
)
assertEquals(Long.MIN_VALUE, restored.lastModifiedTimeStampExcept("x"))
}
@Test
fun testLoadingAfterSameFileBug2() {
val restored = LastModifiedFiles(
LastModifiedFiles.SimultaneouslyChangedFiles(2, mutableSetOf("x", "y")),
LastModifiedFiles.SimultaneouslyChangedFiles(1, mutableSetOf("x"))
)
assertEquals(2, restored.lastModifiedTimeStampExcept("x"))
assertEquals(2, restored.lastModifiedTimeStampExcept("y"))
}
@Test
fun testLoadingAfterSameFileBug3() {
val restored = LastModifiedFiles(
LastModifiedFiles.SimultaneouslyChangedFiles(2, mutableSetOf("x", "y")),
LastModifiedFiles.SimultaneouslyChangedFiles(1, mutableSetOf("x", "z"))
)
assertEquals(2, restored.lastModifiedTimeStampExcept("x"))
assertEquals(2, restored.lastModifiedTimeStampExcept("y"))
}
}