diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFiles.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFiles.kt index e0dea307a89..4e3f6c299a3 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFiles.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFiles.kt @@ -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 = 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) diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFilesTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFilesTest.kt index 059394a37e8..5f8d6e9054f 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFilesTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFilesTest.kt @@ -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")) + } } \ No newline at end of file