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 cde53285c6
commit 34bc52f3d4
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.readStringList
import org.jetbrains.kotlin.idea.core.util.writeNullable import org.jetbrains.kotlin.idea.core.util.writeNullable
import org.jetbrains.kotlin.idea.core.util.writeStringList 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.DataInputStream
import java.io.DataOutput import java.io.DataOutput
@@ -31,6 +27,11 @@ class LastModifiedFiles(
private var last: SimultaneouslyChangedFiles = SimultaneouslyChangedFiles(), private var last: SimultaneouslyChangedFiles = SimultaneouslyChangedFiles(),
private var previous: SimultaneouslyChangedFiles = SimultaneouslyChangedFiles() private var previous: SimultaneouslyChangedFiles = SimultaneouslyChangedFiles()
) { ) {
init {
previous.fileIds.removeAll(last.fileIds)
if (previous.fileIds.isEmpty()) previous = SimultaneouslyChangedFiles()
}
class SimultaneouslyChangedFiles( class SimultaneouslyChangedFiles(
val ts: Long = Long.MIN_VALUE, val ts: Long = Long.MIN_VALUE,
val fileIds: MutableSet<String> = mutableSetOf() val fileIds: MutableSet<String> = mutableSetOf()
@@ -40,7 +41,10 @@ class LastModifiedFiles(
fun fileChanged(ts: Long, fileId: String) { fun fileChanged(ts: Long, fileId: String) {
when { when {
ts > last.ts -> { ts > last.ts -> {
val prevPrev = previous
previous = last previous = last
previous.fileIds.remove(fileId)
if (previous.fileIds.isEmpty()) previous = prevPrev
last = SimultaneouslyChangedFiles(ts, hashSetOf(fileId)) last = SimultaneouslyChangedFiles(ts, hashSetOf(fileId))
} }
ts == last.ts -> last.fileIds.add(fileId) ts == last.ts -> last.fileIds.add(fileId)
@@ -72,4 +72,81 @@ class LastModifiedFilesTest {
assertEquals(3, files.lastModifiedTimeStampExcept("a")) assertEquals(3, files.lastModifiedTimeStampExcept("a"))
assertEquals(3, files.lastModifiedTimeStampExcept("b")) 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"))
}
} }