mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-10-06 06:21:16 +07:00
Fix performance of EditorConfigFileHierarchyServiceImpl (IDEA-200803)
This commit is contained in:
+14
-11
@@ -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<VirtualFile, Reference<List<EditorConfigPsiFile>>>(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<List<EditorConfigPsiFile>?> { 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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user