build.gradle.kts: tests and docs for LastModifiedFiles collection
This commit is contained in:
+7
-31
@@ -14,6 +14,8 @@ import com.intellij.openapi.vfs.newvfs.BulkFileListener
|
|||||||
import com.intellij.openapi.vfs.newvfs.events.VFileEvent
|
import com.intellij.openapi.vfs.newvfs.events.VFileEvent
|
||||||
import com.intellij.util.PathUtil
|
import com.intellij.util.PathUtil
|
||||||
import org.jetbrains.annotations.TestOnly
|
import org.jetbrains.annotations.TestOnly
|
||||||
|
import org.junit.Assert.assertEquals
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
@State(
|
@State(
|
||||||
name = "KotlinBuildScriptsModificationInfo",
|
name = "KotlinBuildScriptsModificationInfo",
|
||||||
@@ -44,43 +46,17 @@ class GradleScriptInputsWatcher(val project: Project) : PersistentStateComponent
|
|||||||
return storage.lastModifiedTimeStampExcept(file) < timeStamp
|
return storage.lastModifiedTimeStampExcept(file) < timeStamp
|
||||||
}
|
}
|
||||||
|
|
||||||
class Storage(
|
class Storage {
|
||||||
private var lastModifiedTS: Long = 0,
|
private val lastModifiedFiles = LastModifiedFiles()
|
||||||
private var lastModifiedFiles: MutableSet<String> = hashSetOf(),
|
|
||||||
private var previousModifiedTS: Long = 0,
|
|
||||||
private var previousModifiedFiles: MutableSet<String> = hashSetOf()
|
|
||||||
) {
|
|
||||||
fun lastModifiedTimeStampExcept(file: VirtualFile): Long {
|
fun lastModifiedTimeStampExcept(file: VirtualFile): Long {
|
||||||
val fileId = getFileId(file)
|
val fileId = getFileId(file)
|
||||||
synchronized(this) {
|
return lastModifiedFiles.lastModifiedTimeStampExcept(fileId)
|
||||||
if (lastModifiedFiles.contains(fileId) && lastModifiedFiles.size == 1) {
|
|
||||||
return previousModifiedTS
|
|
||||||
}
|
|
||||||
return lastModifiedTS
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun fileChanged(file: VirtualFile, ts: Long) {
|
fun fileChanged(file: VirtualFile, ts: Long) {
|
||||||
val fileId = getFileId(file)
|
val fileId = getFileId(file)
|
||||||
synchronized(this) {
|
lastModifiedFiles.fileChanged(ts, fileId)
|
||||||
when {
|
|
||||||
ts > lastModifiedTS -> {
|
|
||||||
previousModifiedFiles = lastModifiedFiles
|
|
||||||
previousModifiedTS = lastModifiedTS
|
|
||||||
|
|
||||||
lastModifiedFiles = hashSetOf(fileId)
|
|
||||||
lastModifiedTS = ts
|
|
||||||
}
|
|
||||||
ts == lastModifiedTS -> {
|
|
||||||
lastModifiedFiles.add(fileId)
|
|
||||||
}
|
|
||||||
ts == previousModifiedTS -> {
|
|
||||||
previousModifiedFiles.add(fileId)
|
|
||||||
}
|
|
||||||
else -> {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getFileId(file: VirtualFile): String {
|
private fun getFileId(file: VirtualFile): String {
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.scripting.gradle
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optimized collection for storing last modified files with ability to
|
||||||
|
* get time of last modified file expect given one ([lastModifiedTimeStampExcept]).
|
||||||
|
*
|
||||||
|
* This is required since Gradle scripts configurations should be updated on
|
||||||
|
* each other script changes (but not on the given script changes itself).
|
||||||
|
*
|
||||||
|
* Actually works by storing two last timestamps with the set of files modified at this times.
|
||||||
|
*/
|
||||||
|
class LastModifiedFiles {
|
||||||
|
private var last: SimultaneouslyChangedFiles = SimultaneouslyChangedFiles()
|
||||||
|
private var previous: SimultaneouslyChangedFiles = SimultaneouslyChangedFiles()
|
||||||
|
|
||||||
|
class SimultaneouslyChangedFiles(
|
||||||
|
val ts: Long = Long.MIN_VALUE,
|
||||||
|
val fileIds: MutableSet<String> = mutableSetOf()
|
||||||
|
)
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
fun fileChanged(ts: Long, fileId: String) {
|
||||||
|
when {
|
||||||
|
ts > last.ts -> {
|
||||||
|
previous = last
|
||||||
|
last = SimultaneouslyChangedFiles(ts, hashSetOf(fileId))
|
||||||
|
}
|
||||||
|
ts == last.ts -> last.fileIds.add(fileId)
|
||||||
|
ts == previous.ts -> previous.fileIds.add(fileId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
fun lastModifiedTimeStampExcept(fileId: String): Long = when {
|
||||||
|
last.fileIds.size == 1 && last.fileIds.contains(fileId) -> previous.ts
|
||||||
|
else -> last.ts
|
||||||
|
}
|
||||||
|
}
|
||||||
+75
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.scripting.gradle
|
||||||
|
|
||||||
|
import org.junit.Test
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class LastModifiedFilesTest {
|
||||||
|
val files = LastModifiedFiles()
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSimple0() {
|
||||||
|
assertEquals(Long.MIN_VALUE, files.lastModifiedTimeStampExcept("x"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSimple1() {
|
||||||
|
files.fileChanged(1, "x")
|
||||||
|
assertEquals(Long.MIN_VALUE, files.lastModifiedTimeStampExcept("x"))
|
||||||
|
assertEquals(1, files.lastModifiedTimeStampExcept("y"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSimple2() {
|
||||||
|
files.fileChanged(1, "x")
|
||||||
|
files.fileChanged(2, "y")
|
||||||
|
assertEquals(2, files.lastModifiedTimeStampExcept("x"))
|
||||||
|
assertEquals(1, files.lastModifiedTimeStampExcept("y"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSimple3() {
|
||||||
|
files.fileChanged(1, "x")
|
||||||
|
files.fileChanged(2, "y")
|
||||||
|
files.fileChanged(3, "z")
|
||||||
|
assertEquals(3, files.lastModifiedTimeStampExcept("x"))
|
||||||
|
assertEquals(3, files.lastModifiedTimeStampExcept("y"))
|
||||||
|
assertEquals(2, files.lastModifiedTimeStampExcept("z"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSame2() {
|
||||||
|
files.fileChanged(1, "x")
|
||||||
|
files.fileChanged(1, "y")
|
||||||
|
assertEquals(1, files.lastModifiedTimeStampExcept("x"))
|
||||||
|
assertEquals(1, files.lastModifiedTimeStampExcept("y"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSame3() {
|
||||||
|
files.fileChanged(1, "x")
|
||||||
|
files.fileChanged(1, "y")
|
||||||
|
files.fileChanged(2, "z")
|
||||||
|
assertEquals(2, files.lastModifiedTimeStampExcept("x"))
|
||||||
|
assertEquals(2, files.lastModifiedTimeStampExcept("y"))
|
||||||
|
assertEquals(1, files.lastModifiedTimeStampExcept("z"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSame4() {
|
||||||
|
files.fileChanged(1, "x")
|
||||||
|
files.fileChanged(1, "y")
|
||||||
|
files.fileChanged(2, "z")
|
||||||
|
files.fileChanged(3, "a")
|
||||||
|
files.fileChanged(3, "b")
|
||||||
|
assertEquals(3, files.lastModifiedTimeStampExcept("x"))
|
||||||
|
assertEquals(3, files.lastModifiedTimeStampExcept("y"))
|
||||||
|
assertEquals(3, files.lastModifiedTimeStampExcept("z"))
|
||||||
|
assertEquals(3, files.lastModifiedTimeStampExcept("a"))
|
||||||
|
assertEquals(3, files.lastModifiedTimeStampExcept("b"))
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user