From 04424a1ec358ea9143e28bc8bccdd29a6fa6857c Mon Sep 17 00:00:00 2001 From: Nikita Skvortsov Date: Tue, 25 Feb 2020 23:56:51 +0300 Subject: [PATCH] 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 --- .../scripting/gradle/AsyncFileChangeListenerHelper.kt | 9 +++++++-- .../gradle/AsyncFileChangeListenerHelper.kt.201 | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/AsyncFileChangeListenerHelper.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/AsyncFileChangeListenerHelper.kt index 66ec30ba410..832aaf3d2fb 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/AsyncFileChangeListenerHelper.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/AsyncFileChangeListenerHelper.kt @@ -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 = 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, diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/AsyncFileChangeListenerHelper.kt.201 b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/AsyncFileChangeListenerHelper.kt.201 index 3ccd693666c..e3659086bc5 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/AsyncFileChangeListenerHelper.kt.201 +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/AsyncFileChangeListenerHelper.kt.201 @@ -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 = 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,