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.VirtualFile
import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.openapi.vfs.newvfs.events.VFileEvent import com.intellij.openapi.vfs.newvfs.events.VFileEvent
import java.util.*
fun addVfsListener(watcher: GradleScriptInputsWatcher) { fun addVfsListener(watcher: GradleScriptInputsWatcher) {
VirtualFileManager.getInstance().addAsyncFileListener( VirtualFileManager.getInstance().addAsyncFileListener(
object : AsyncFileChangeListenerBase() { object : AsyncFileChangeListenerBase() {
private var files: Set<String> = Collections.emptySet()
override fun isRelevant(path: String): Boolean { override fun isRelevant(path: String): Boolean {
val files = getAffectedGradleProjectFiles(watcher.project)
return isInAffectedGradleProjectFiles(files, path) return isInAffectedGradleProjectFiles(files, path)
} }
@@ -25,7 +28,9 @@ fun addVfsListener(watcher: GradleScriptInputsWatcher) {
// do nothing // do nothing
override fun prepareFileDeletion(file: VirtualFile) {} override fun prepareFileDeletion(file: VirtualFile) {}
override fun apply() {} override fun apply() {}
override fun reset() {} override fun reset() {
files = getAffectedGradleProjectFiles(watcher.project)
}
}, },
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.VirtualFile
import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.openapi.vfs.newvfs.events.VFileEvent import com.intellij.openapi.vfs.newvfs.events.VFileEvent
import java.util.*
fun addVfsListener(watcher: GradleScriptInputsWatcher) { fun addVfsListener(watcher: GradleScriptInputsWatcher) {
VirtualFileManager.getInstance().addAsyncFileListener( VirtualFileManager.getInstance().addAsyncFileListener(
object : AsyncFileChangeListenerBase() { object : AsyncFileChangeListenerBase() {
private var files: Set<String> = Collections.emptySet();
override fun isRelevant(path: String): Boolean { override fun isRelevant(path: String): Boolean {
val files = getAffectedGradleProjectFiles(watcher.project)
return isInAffectedGradleProjectFiles(files, path) return isInAffectedGradleProjectFiles(files, path)
} }
@@ -24,7 +27,9 @@ fun addVfsListener(watcher: GradleScriptInputsWatcher) {
// do nothing // do nothing
override fun apply() {} override fun apply() {}
override fun init() {} override fun init() {
files = getAffectedGradleProjectFiles(watcher.project)
}
}, },
watcher.project, watcher.project,