IJPL-194103 Formatting Widget does not update its icon after manipulations with .editorconfig

- join the caches and remove redundant code

GitOrigin-RevId: d78ea7b69c6de7be81492545c43cca71f13e9d52
This commit is contained in:
Alexey Utkin
2025-07-04 18:54:27 +00:00
committed by intellij-monorepo-bot
parent c5505db04c
commit 0d6cde7d67
3 changed files with 32 additions and 76 deletions
@@ -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<AnAction> 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")
@@ -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<String> = ArrayList()
object EditorConfigNavigationActionsFactory {
fun getNavigationActions(project: Project, sourceFile: VirtualFile): List<AnAction> {
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<String>) {
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<AnAction>) : 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<EditorConfigNavigationActionsFactory>("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)
}
}
}
@@ -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}" }