From 0d6cde7d6763d21d12beb87a8864434cd762e647 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Fri, 4 Jul 2025 19:22:19 +0400 Subject: [PATCH] IJPL-194103 Formatting Widget does not update its icon after manipulations with .editorconfig - join the caches and remove redundant code GitOrigin-RevId: d78ea7b69c6de7be81492545c43cca71f13e9d52 --- .../EditorConfigActionUtil.java | 25 ++---- .../EditorConfigNavigationActionsFactory.kt | 77 +++++++------------ .../EditorConfigCodeStyleSettingsModifier.kt | 6 +- 3 files changed, 32 insertions(+), 76 deletions(-) diff --git a/plugins/editorconfig/backend/src/configmanagement/EditorConfigActionUtil.java b/plugins/editorconfig/backend/src/configmanagement/EditorConfigActionUtil.java index 571611a9f951..4217695aaa27 100644 --- a/plugins/editorconfig/backend/src/configmanagement/EditorConfigActionUtil.java +++ b/plugins/editorconfig/backend/src/configmanagement/EditorConfigActionUtil.java @@ -3,42 +3,27 @@ package org.editorconfig.configmanagement; import com.intellij.application.options.CodeStyle; import com.intellij.editorconfig.common.EditorConfigBundle; -import com.intellij.ide.actions.ShowSettingsUtilImpl; import com.intellij.ide.actions.searcheverywhere.SearchEverywhereManager; import com.intellij.ide.actions.searcheverywhere.SearchEverywhereManagerImpl; -import com.intellij.notification.Notification; -import com.intellij.notification.NotificationGroup; -import com.intellij.notification.NotificationGroupManager; -import com.intellij.notification.NotificationType; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.registry.Registry; import com.intellij.psi.PsiFile; -import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import org.editorconfig.Utils; import org.editorconfig.settings.EditorConfigSettings; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.List; public final class EditorConfigActionUtil { - public static AnAction[] createNavigationActions(@NotNull PsiFile file) { - EditorConfigNavigationActionsFactory navigationActionsFactory = - EditorConfigNavigationActionsFactory.Companion.getInstance(file); - if (navigationActionsFactory == null) { - return AnAction.EMPTY_ARRAY; - } - List actions = new ArrayList<>(navigationActionsFactory.getNavigationActions(file.getProject(), file.getVirtualFile())); - return actions.toArray(AnAction.EMPTY_ARRAY); + public static AnAction @NotNull [] createNavigationActions(@NotNull PsiFile file) { + return EditorConfigNavigationActionsFactory + .INSTANCE + .getNavigationActions(file.getProject(), file.getVirtualFile()) + .toArray(AnAction.EMPTY_ARRAY); } @Contract("_, _ -> new") diff --git a/plugins/editorconfig/backend/src/configmanagement/EditorConfigNavigationActionsFactory.kt b/plugins/editorconfig/backend/src/configmanagement/EditorConfigNavigationActionsFactory.kt index fa2685930e8a..7bae9d7e0265 100644 --- a/plugins/editorconfig/backend/src/configmanagement/EditorConfigNavigationActionsFactory.kt +++ b/plugins/editorconfig/backend/src/configmanagement/EditorConfigNavigationActionsFactory.kt @@ -1,7 +1,6 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.editorconfig.configmanagement -import com.intellij.application.options.codeStyle.cache.CodeStyleCachingService import com.intellij.editorconfig.common.EditorConfigBundle.message import com.intellij.openapi.actionSystem.ActionGroup import com.intellij.openapi.actionSystem.AnAction @@ -9,33 +8,29 @@ import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.fileEditor.FileEditorManager import com.intellij.openapi.project.DumbAwareAction import com.intellij.openapi.project.Project -import com.intellij.openapi.util.Key import com.intellij.openapi.vfs.VirtualFile -import com.intellij.psi.PsiFile import com.intellij.util.containers.toArray import org.editorconfig.Utils import org.editorconfig.configmanagement.editor.EditorConfigPreviewManager import org.editorconfig.language.util.EditorConfigPresentationUtil.getFileName import org.jetbrains.annotations.Nls -class EditorConfigNavigationActionsFactory private constructor() { - private val myEditorConfigFilePaths: MutableList = ArrayList() - +object EditorConfigNavigationActionsFactory { fun getNavigationActions(project: Project, sourceFile: VirtualFile): List { - val actions = synchronized(myEditorConfigFilePaths) { - val editorConfigFiles = Utils.pathsToFiles(myEditorConfigFilePaths) - editorConfigFiles.map { file -> - DumbAwareAction.create(getActionName(file, editorConfigFiles.size > 1)) { openEditorConfig(project, sourceFile, file) } + val editorConfigFiles = Utils.relatedEditorConfigFiles(sourceFile) + if (editorConfigFiles.isEmpty()) return emptyList() + + val withFolder = editorConfigFiles.size > 1 + val navigationActions = editorConfigFiles.map { editorConfigFile -> + DumbAwareAction.create(getActionName(editorConfigFile, withFolder)) { + openEditorConfig(project, sourceFile, editorConfigFile) } } - return if (actions.size <= 1) actions else listOf(NavigationActionGroup(actions.toArray(AnAction.EMPTY_ARRAY))) - } - - fun updateEditorConfigFilePaths(editorConfigFilePaths: List) { - synchronized(myEditorConfigFilePaths) { - myEditorConfigFilePaths.clear() - myEditorConfigFilePaths.addAll(editorConfigFilePaths) - } + + return if (withFolder) + listOf(NavigationActionGroup(navigationActions.toArray(AnAction.EMPTY_ARRAY))) + else + navigationActions } private class NavigationActionGroup(private val myChildActions: Array) : ActionGroup( @@ -44,39 +39,19 @@ class EditorConfigNavigationActionsFactory private constructor() { return myChildActions } } + + private fun getActionName(file: VirtualFile, withFolder: Boolean): @Nls String = + if (!withFolder) + message("action.open.file") + else + getFileName(file, withFolder) - companion object { - private val NAVIGATION_FACTORY_KEY = Key.create("editor.config.navigation.factory") - private val INSTANCE_LOCK = Any() - private fun openEditorConfig(project: Project, sourceFile: VirtualFile, editorConfigFile: VirtualFile) { - val fileEditorManager = FileEditorManager.getInstance(project) - if (fileEditorManager.isFileOpen(editorConfigFile)) { - fileEditorManager.closeFile(editorConfigFile) - } - EditorConfigPreviewManager.getInstance(project).associateWithPreviewFile(editorConfigFile, sourceFile) - fileEditorManager.openFile(editorConfigFile, true) - } - - private fun getActionName(file: VirtualFile, withFolder: Boolean): @Nls String { - val fileName = getFileName(file, withFolder) - return if (!withFolder) message("action.open.file") else fileName - } - - fun getInstance(psiFile: PsiFile): EditorConfigNavigationActionsFactory? { - val project = psiFile.project - val file = psiFile.virtualFile - synchronized(INSTANCE_LOCK) { - val dataHolder = CodeStyleCachingService.getInstance(project).getDataHolder(file) - var instance: EditorConfigNavigationActionsFactory? = null - if (dataHolder != null) { - instance = dataHolder.getUserData(NAVIGATION_FACTORY_KEY) - if (instance == null) { - instance = EditorConfigNavigationActionsFactory() - dataHolder.putUserData(NAVIGATION_FACTORY_KEY, instance) - } - } - return instance - } + private fun openEditorConfig(project: Project, sourceFile: VirtualFile, editorConfigFile: VirtualFile) { + val fileEditorManager = FileEditorManager.getInstance(project) + if (fileEditorManager.isFileOpen(editorConfigFile)) { + fileEditorManager.closeFile(editorConfigFile) } + EditorConfigPreviewManager.getInstance(project).associateWithPreviewFile(editorConfigFile, sourceFile) + fileEditorManager.openFile(editorConfigFile, true) } -} \ No newline at end of file +} diff --git a/plugins/editorconfig/backend/src/configmanagement/extended/EditorConfigCodeStyleSettingsModifier.kt b/plugins/editorconfig/backend/src/configmanagement/extended/EditorConfigCodeStyleSettingsModifier.kt index 4fe3666e3319..539cad4d2a65 100644 --- a/plugins/editorconfig/backend/src/configmanagement/extended/EditorConfigCodeStyleSettingsModifier.kt +++ b/plugins/editorconfig/backend/src/configmanagement/extended/EditorConfigCodeStyleSettingsModifier.kt @@ -36,7 +36,6 @@ import org.ec4j.core.ResourceProperties import org.editorconfig.EditorConfigNotifier import org.editorconfig.Utils import org.editorconfig.configmanagement.EditorConfigActionUtil -import org.editorconfig.configmanagement.EditorConfigNavigationActionsFactory import org.editorconfig.configmanagement.EditorConfigUsagesCollector.logEditorConfigUsed import org.editorconfig.plugincomponents.EditorConfigPropertiesService import org.editorconfig.settings.EditorConfigSettings @@ -81,10 +80,7 @@ class EditorConfigCodeStyleSettingsModifier : CodeStyleSettingsModifier { settings.setModifier(this) settings.addDependency(EditorConfigPropertiesService.getInstance(project)) - - val navigationFactory = EditorConfigNavigationActionsFactory.getInstance(psiFile) - navigationFactory?.updateEditorConfigFilePaths(editorConfigs.map { it.path }) - + // Apply editorconfig settings for the current editor if (applyCodeStyleSettings(settings, properties, psiFile)) { LOG.debug { "Modified for ${psiFile.name}" }