diff --git a/plugins/editorconfig/src/org/editorconfig/language/services/impl/EditorConfigFileHierarchyServiceImpl.kt b/plugins/editorconfig/src/org/editorconfig/language/services/impl/EditorConfigFileHierarchyServiceImpl.kt index fa5e6cd26c1e..c1fac2d54ebe 100644 --- a/plugins/editorconfig/src/org/editorconfig/language/services/impl/EditorConfigFileHierarchyServiceImpl.kt +++ b/plugins/editorconfig/src/org/editorconfig/language/services/impl/EditorConfigFileHierarchyServiceImpl.kt @@ -7,6 +7,7 @@ import com.intellij.openapi.application.ReadAction import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.progress.ProgressIndicatorProvider import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.Project import com.intellij.openapi.util.registry.Registry import com.intellij.openapi.util.registry.RegistryValue @@ -20,6 +21,8 @@ import com.intellij.psi.codeStyle.CodeStyleSettingsManager import com.intellij.reference.SoftReference import com.intellij.util.concurrency.SequentialTaskExecutor import com.intellij.util.containers.FixedHashMap +import com.intellij.util.ui.update.MergingUpdateQueue +import com.intellij.util.ui.update.Update import org.editorconfig.EditorConfigRegistry import org.editorconfig.language.filetype.EditorConfigFileConstants import org.editorconfig.language.psi.EditorConfigPsiFile @@ -35,8 +38,9 @@ class EditorConfigFileHierarchyServiceImpl( private val project: Project ) : EditorConfigFileHierarchyService(), BulkFileListener, RegistryValueListener { - private val taskExecutor = SequentialTaskExecutor - .createSequentialApplicationPoolExecutor("editorconfig.notification.vfs.update.executor") + private val taskExecutor = SequentialTaskExecutor.createSequentialApplicationPoolExecutor("editorconfig.notification.vfs.update.executor") + + private val updateQueue = MergingUpdateQueue("EditorConfigFileHierarchy UpdateQueue", 500, true, null, project) @Volatile private var cacheDropsCount = 0 @@ -44,13 +48,16 @@ class EditorConfigFileHierarchyServiceImpl( private val affectingFilesCache = FixedHashMap>>(CacheSize) init { - application.messageBus.connect().subscribe(VirtualFileManager.VFS_CHANGES, this) + DumbService.getInstance(project).runWhenSmart { + application.messageBus.connect(project).subscribe(VirtualFileManager.VFS_CHANGES, this) + } Registry.get(EditorConfigRegistry.EDITORCONFIG_STOP_AT_PROJECT_ROOT_KEY).addListener(this, project) } private fun updateHandlers(project: Project) { - application.assertIsDispatchThread() - CodeStyleSettingsManager.getInstance(project).fireCodeStyleSettingsChanged(null) + updateQueue.queue(Update.create("editorconfig hierarchy update") { + CodeStyleSettingsManager.getInstance(project).fireCodeStyleSettingsChanged(null) + }) } // method of BulkFileListener @@ -66,9 +73,7 @@ class EditorConfigFileHierarchyServiceImpl( cacheDropsCount += 1 affectingFilesCache.clear() } - if(!project.isDisposed) { - updateHandlers(project) - } + updateHandlers(project) } } @@ -97,13 +102,11 @@ class EditorConfigFileHierarchyServiceImpl( .nonBlocking?> { findApplicableFiles(virtualFile) } .expireWhen { project.isDisposed } .finishOnUiThread(ModalityState.any()) ui@{ affectingFiles -> - affectingFiles ?: return@ui + if (affectingFiles == null) return@ui synchronized(cacheLocker) { if (expectedCacheDropsCount != cacheDropsCount) return@ui affectingFilesCache[virtualFile] = SoftReference(affectingFiles) } - - updateHandlers(project) }.submit(taskExecutor) }