Reduce UI freezes by preparing affected Gradle project files lists in advance, once per event. isRelevant() method is a hotspot, as it is called for each file in bulk VFS event

This commit is contained in:
Nikita Skvortsov
2020-02-25 23:56:51 +03:00
committed by Sergey Rostov
parent a9e03937a3
commit 04424a1ec3
2 changed files with 14 additions and 4 deletions
@@ -9,12 +9,15 @@ import com.intellij.openapi.externalSystem.service.project.autoimport.AsyncFileC
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.openapi.vfs.newvfs.events.VFileEvent
import java.util.*
fun addVfsListener(watcher: GradleScriptInputsWatcher) {
VirtualFileManager.getInstance().addAsyncFileListener(
object : AsyncFileChangeListenerBase() {
private var files: Set<String> = Collections.emptySet()
override fun isRelevant(path: String): Boolean {
val files = getAffectedGradleProjectFiles(watcher.project)
return isInAffectedGradleProjectFiles(files, path)
}
@@ -25,7 +28,9 @@ fun addVfsListener(watcher: GradleScriptInputsWatcher) {
// do nothing
override fun prepareFileDeletion(file: VirtualFile) {}
override fun apply() {}
override fun reset() {}
override fun reset() {
files = getAffectedGradleProjectFiles(watcher.project)
}
},
watcher.project,
@@ -9,12 +9,15 @@ import com.intellij.openapi.externalSystem.autoimport.AsyncFileChangeListenerBas
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.openapi.vfs.newvfs.events.VFileEvent
import java.util.*
fun addVfsListener(watcher: GradleScriptInputsWatcher) {
VirtualFileManager.getInstance().addAsyncFileListener(
object : AsyncFileChangeListenerBase() {
private var files: Set<String> = Collections.emptySet();
override fun isRelevant(path: String): Boolean {
val files = getAffectedGradleProjectFiles(watcher.project)
return isInAffectedGradleProjectFiles(files, path)
}
@@ -24,7 +27,9 @@ fun addVfsListener(watcher: GradleScriptInputsWatcher) {
// do nothing
override fun apply() {}
override fun init() {}
override fun init() {
files = getAffectedGradleProjectFiles(watcher.project)
}
},
watcher.project,