From e6ec4b63dbff742527d043a83001a7986af5357b Mon Sep 17 00:00:00 2001 From: vitaliy Date: Mon, 8 Jun 2026 09:43:09 +0300 Subject: [PATCH 1/3] Convert ReadAction.compute() calls to computeBlocking() for improved responsiveness --- .../generator/PhpFileGenerator.java | 4 +-- .../generator/util/DirectoryGenerator.java | 6 ++-- .../MagentoInitJsonErrorFilter.java | 2 +- .../magento2plugin/indexes/ModuleIndex.java | 6 ++-- .../js/JsMixinLineMarkerProvider.java | 13 ++++----- .../KnockoutTemplateLineMarkerProvider.java | 15 ++-------- .../js/LineMarkerTargetPresentationUtil.java | 28 +------------------ .../magento2plugin/project/SettingsForm.java | 7 ++++- ...MagentoAdditionalLibraryRootsProvider.java | 4 +-- .../magento2plugin/util/GetPhpClassByFQN.java | 2 +- .../util/magento/MagentoVersionUtil.java | 2 +- .../mcp/MagentoCliToolQueries.kt | 4 +-- .../mcp/MagentoModuleCommands.kt | 14 +++++----- 13 files changed, 37 insertions(+), 70 deletions(-) diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/PhpFileGenerator.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/PhpFileGenerator.java index 21bc5bdc6..5548040f6 100644 --- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/PhpFileGenerator.java +++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/PhpFileGenerator.java @@ -68,7 +68,7 @@ public PhpFileGenerator( public PsiFile generate(final @NotNull String actionName) { file = getFile(); - final PhpClass phpClass = ReadAction.compute(() -> + final PhpClass phpClass = ReadAction.computeBlocking(() -> GetPhpClassByFQN.getInstance(project).execute(file.getClassFqn()) ); @@ -78,7 +78,7 @@ public PsiFile generate(final @NotNull String actionName) { return phpClass.getContainingFile(); } - final PsiDirectory moduleDirectory = ReadAction.compute(() -> + final PsiDirectory moduleDirectory = ReadAction.computeBlocking(() -> moduleIndex.getModuleDirectoryByModuleName(file.getModuleName()) ); diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DirectoryGenerator.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DirectoryGenerator.java index b2ac27768..7ea041267 100644 --- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DirectoryGenerator.java +++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DirectoryGenerator.java @@ -64,7 +64,7 @@ public PsiDirectory findOrCreateSubdirectory( final @NotNull PsiDirectory parent, final @NotNull String subdirName ) { - final PsiDirectory sub = ReadAction.compute(() -> parent.findSubdirectory(subdirName)); + final PsiDirectory sub = ReadAction.computeBlocking(() -> parent.findSubdirectory(subdirName)); return sub == null ? createSubdirectoryOnEdt(parent, subdirName) : sub; } @@ -85,7 +85,7 @@ public PsiDirectory findOrCreateSubdirectories( for (final String directory : Arrays.asList(directories)) { if (lastDirectory == null) { - final PsiDirectory subDir = ReadAction.compute(() -> parent.findSubdirectory(directory)); + final PsiDirectory subDir = ReadAction.computeBlocking(() -> parent.findSubdirectory(directory)); if (subDir == null) { lastDirectory = createSubdirectoryOnEdt(parent, directory); @@ -94,7 +94,7 @@ public PsiDirectory findOrCreateSubdirectories( } } else { final PsiDirectory currentDirectory = lastDirectory; - final PsiDirectory subDir = ReadAction.compute(() -> + final PsiDirectory subDir = ReadAction.computeBlocking(() -> currentDirectory.findSubdirectory(directory)); if (subDir == null) { diff --git a/src/main/java/com/magento/idea/magento2plugin/highlighting/MagentoInitJsonErrorFilter.java b/src/main/java/com/magento/idea/magento2plugin/highlighting/MagentoInitJsonErrorFilter.java index 9038189eb..66f58d85e 100644 --- a/src/main/java/com/magento/idea/magento2plugin/highlighting/MagentoInitJsonErrorFilter.java +++ b/src/main/java/com/magento/idea/magento2plugin/highlighting/MagentoInitJsonErrorFilter.java @@ -42,7 +42,7 @@ public boolean shouldHighlightErrorElement(final @NotNull PsiErrorElement elemen @Override public boolean accept(final @NotNull HighlightInfo highlightInfo, final PsiFile file) { - if (!highlightInfo.isFromInjection() || !HighlightSeverity.ERROR.equals(highlightInfo.getSeverity())) { + if (!HighlightSeverity.ERROR.equals(highlightInfo.getSeverity())) { return true; } final PsiLanguageInjectionHost host = findInjectedJsonHost(file, highlightInfo.getStartOffset()); diff --git a/src/main/java/com/magento/idea/magento2plugin/indexes/ModuleIndex.java b/src/main/java/com/magento/idea/magento2plugin/indexes/ModuleIndex.java index 24b6a9b8d..2a825bbc6 100644 --- a/src/main/java/com/magento/idea/magento2plugin/indexes/ModuleIndex.java +++ b/src/main/java/com/magento/idea/magento2plugin/indexes/ModuleIndex.java @@ -81,7 +81,7 @@ private List getNames( final ID indexKey, final boolean withinProject ) { - return ReadAction.compute(() -> { + return ReadAction.computeBlocking(() -> { final Set names = new LinkedHashSet<>(); final FileBasedIndex index = FileBasedIndex.getInstance(); final Collection allNames = index.getAllKeys(indexKey, project); @@ -122,7 +122,7 @@ private List getNames( * @return PsiDirectory */ public @Nullable PsiDirectory getModuleDirectoryByModuleName(final String moduleName) { - return ReadAction.compute(() -> { + return ReadAction.computeBlocking(() -> { final VirtualFile moduleDirectory = getModuleDirectoryVirtualFileByModuleName(moduleName); if (moduleDirectory == null) { return null; @@ -140,7 +140,7 @@ private List getNames( * @return VirtualFile */ public @Nullable VirtualFile getModuleDirectoryVirtualFileByModuleName(final String moduleName) { - return ReadAction.compute(() -> { + return ReadAction.computeBlocking(() -> { if (moduleName == null) { return null; } diff --git a/src/main/java/com/magento/idea/magento2plugin/linemarker/js/JsMixinLineMarkerProvider.java b/src/main/java/com/magento/idea/magento2plugin/linemarker/js/JsMixinLineMarkerProvider.java index f80ca285b..fd8275a38 100644 --- a/src/main/java/com/magento/idea/magento2plugin/linemarker/js/JsMixinLineMarkerProvider.java +++ b/src/main/java/com/magento/idea/magento2plugin/linemarker/js/JsMixinLineMarkerProvider.java @@ -8,7 +8,6 @@ import com.intellij.codeInsight.daemon.LineMarkerInfo; import com.intellij.codeInsight.daemon.LineMarkerProvider; import com.intellij.icons.AllIcons; -import com.intellij.lang.ASTNode; import com.intellij.lang.javascript.JavaScriptFileType; import com.intellij.lang.javascript.psi.JSExpression; import com.intellij.lang.javascript.psi.JSFile; @@ -497,10 +496,10 @@ private int getFirstCodeOffset(final @NotNull String text) { if (!isFunctionProperty(property)) { continue; } - final ASTNode nameIdentifier = property.findNameIdentifier(); + final PsiElement nameIdentifier = property.getNameIdentifier(); if (nameIdentifier != null) { - result.add(new MixinOverride(property.getName(), nameIdentifier.getPsi())); + result.add(new MixinOverride(property.getName(), nameIdentifier)); } } } @@ -532,10 +531,10 @@ private int getFirstCodeOffset(final @NotNull String text) { if (!isFunctionProperty(property)) { continue; } - final ASTNode nameIdentifier = property.findNameIdentifier(); + final PsiElement nameIdentifier = property.getNameIdentifier(); if (nameIdentifier != null) { - result.add(nameIdentifier.getPsi()); + result.add(nameIdentifier); } } @@ -556,10 +555,10 @@ private int getFirstCodeOffset(final @NotNull String text) { if (!isFunctionProperty(property)) { continue; } - final ASTNode nameIdentifier = property.findNameIdentifier(); + final PsiElement nameIdentifier = property.getNameIdentifier(); if (nameIdentifier != null) { - result.add(nameIdentifier.getPsi()); + result.add(nameIdentifier); } } diff --git a/src/main/java/com/magento/idea/magento2plugin/linemarker/js/KnockoutTemplateLineMarkerProvider.java b/src/main/java/com/magento/idea/magento2plugin/linemarker/js/KnockoutTemplateLineMarkerProvider.java index 6a38a5d54..c7049a87f 100644 --- a/src/main/java/com/magento/idea/magento2plugin/linemarker/js/KnockoutTemplateLineMarkerProvider.java +++ b/src/main/java/com/magento/idea/magento2plugin/linemarker/js/KnockoutTemplateLineMarkerProvider.java @@ -10,7 +10,6 @@ import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder; import com.intellij.ide.highlighter.HtmlFileType; import com.intellij.ide.highlighter.XmlFileType; -import com.intellij.lang.ASTNode; import com.intellij.lang.javascript.JavaScriptFileType; import com.intellij.lang.javascript.psi.JSFile; import com.intellij.lang.javascript.psi.JSProperty; @@ -161,7 +160,6 @@ private void addXmlComponentLineMarker( .setTargets(preparedTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) - .setCellRenderer(LineMarkerTargetPresentationUtil.CELL_RENDERER) .setTooltipText(MAGENTO_UI_COMPONENT_TOOLTIP_TEXT) .createLineMarkerInfo( anchor, @@ -198,7 +196,6 @@ private void addXmlTemplateLineMarker( .setTargets(preparedTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) - .setCellRenderer(LineMarkerTargetPresentationUtil.CELL_RENDERER) .setTooltipText(MAGENTO_TEMPLATE_TOOLTIP_TEXT) .createLineMarkerInfo( anchor, @@ -245,7 +242,6 @@ private void addLayoutTemplateLineMarker( .setTargets(LineMarkerTargetPresentationUtil.prepareTargets(targets)) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) - .setCellRenderer(LineMarkerTargetPresentationUtil.CELL_RENDERER) .setTooltipText(TEMPLATE_TOOLTIP_TEXT) .createLineMarkerInfo(anchor)); } @@ -277,7 +273,6 @@ private void addLayoutDisplayAreaLineMarker( .setTargets(preparedTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) - .setCellRenderer(LineMarkerTargetPresentationUtil.CELL_RENDERER) .setTooltipText(REGION_TEMPLATE_TOOLTIP_TEXT) .createLineMarkerInfo( anchor, @@ -334,7 +329,6 @@ private void addGetRegionLineMarkers( .setTargets(preparedTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) - .setCellRenderer(LineMarkerTargetPresentationUtil.CELL_RENDERER) .setTooltipText(REGION_DISPLAY_AREA_TOOLTIP_TEXT) .createLineMarkerInfo( anchor, @@ -376,7 +370,6 @@ private boolean addLegacyGetRegionLineMarker( .setTargets(preparedChildTemplates) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) - .setCellRenderer(LineMarkerTargetPresentationUtil.CELL_RENDERER) .setTooltipText(REGION_CHILD_TEMPLATE_TOOLTIP_TEXT) .createLineMarkerInfo( anchor, @@ -394,7 +387,6 @@ private boolean addLegacyGetRegionLineMarker( .setTargets(preparedComponentTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) - .setCellRenderer(LineMarkerTargetPresentationUtil.CELL_RENDERER) .setTooltipText(REGION_COMPONENT_TOOLTIP_TEXT) .createLineMarkerInfo( anchor, @@ -425,8 +417,8 @@ private void addDisplayAreaLineMarkers( if (targets.isEmpty()) { continue; } - final ASTNode nameIdentifier = property.findNameIdentifier(); - final PsiElement anchor = nameIdentifier == null ? property : nameIdentifier.getPsi(); + final PsiElement nameIdentifier = property.getNameIdentifier(); + final PsiElement anchor = nameIdentifier == null ? property : nameIdentifier; final List preparedTargets = LineMarkerTargetPresentationUtil.prepareTargets(targets); collection.add(NavigationGutterIconBuilder @@ -434,7 +426,6 @@ private void addDisplayAreaLineMarkers( .setTargets(preparedTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) - .setCellRenderer(LineMarkerTargetPresentationUtil.CELL_RENDERER) .setTooltipText(REGION_TEMPLATE_TOOLTIP_TEXT) .createLineMarkerInfo( anchor, @@ -496,7 +487,6 @@ private void addDisplayAreaLineMarkers( .setTargets(preparedTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) - .setCellRenderer(LineMarkerTargetPresentationUtil.CELL_RENDERER) .setTooltipText(tooltip) .createLineMarkerInfo( anchor, @@ -526,7 +516,6 @@ private void addDisplayAreaLineMarkers( .setTargets(preparedTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) - .setCellRenderer(LineMarkerTargetPresentationUtil.CELL_RENDERER) .setTooltipText(tooltip) .createLineMarkerInfo( anchor, diff --git a/src/main/java/com/magento/idea/magento2plugin/linemarker/js/LineMarkerTargetPresentationUtil.java b/src/main/java/com/magento/idea/magento2plugin/linemarker/js/LineMarkerTargetPresentationUtil.java index 81f414b07..409a5b7a6 100644 --- a/src/main/java/com/magento/idea/magento2plugin/linemarker/js/LineMarkerTargetPresentationUtil.java +++ b/src/main/java/com/magento/idea/magento2plugin/linemarker/js/LineMarkerTargetPresentationUtil.java @@ -9,9 +9,8 @@ import com.intellij.codeInsight.navigation.NavigationUtil; import com.intellij.codeInsight.navigation.PsiTargetNavigator; import com.intellij.codeInsight.navigation.impl.PsiTargetPresentationRenderer; -import com.intellij.ide.util.PsiElementListCellRenderer; -import com.intellij.openapi.util.Iconable; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Iconable; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.platform.backend.presentation.TargetPresentation; @@ -41,31 +40,6 @@ public String getContainerText(final PsiElement element) { } }; - static final PsiElementListCellRenderer CELL_RENDERER = new PsiElementListCellRenderer<>() { - @Override - public String getElementText(final PsiElement element) { - return getPresentableTargetName(element); - } - - @Override - protected String getContainerText(final PsiElement element, final String name) { - return null; - } - - @Override - protected int getIconFlags() { - return Iconable.ICON_FLAG_VISIBILITY; - } - - @Override - public Comparator getComparator() { - return Comparator - .comparingInt(LineMarkerTargetPresentationUtil::getPriority) - .thenComparing(LineMarkerTargetPresentationUtil::getPresentableTargetName) - .thenComparing(LineMarkerTargetPresentationUtil::getStableKey); - } - }; - private LineMarkerTargetPresentationUtil() { } diff --git a/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java b/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java index 8d2705588..88fc1c578 100644 --- a/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java +++ b/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java @@ -150,7 +150,12 @@ private void reindexFromForm() { NotificationType.INFORMATION ); } catch (final ConfigurationException exception) { - Messages.showErrorDialog(project, exception.getMessage(), "Magento Reindex"); + final String message = exception.getLocalizedMessage(); + Messages.showErrorDialog( + project, + message == null ? "Invalid Magento settings." : message, + "Magento Reindex" + ); } } diff --git a/src/main/java/com/magento/idea/magento2plugin/project/indexing/MagentoAdditionalLibraryRootsProvider.java b/src/main/java/com/magento/idea/magento2plugin/project/indexing/MagentoAdditionalLibraryRootsProvider.java index c40a53d0f..f6e5ff83e 100644 --- a/src/main/java/com/magento/idea/magento2plugin/project/indexing/MagentoAdditionalLibraryRootsProvider.java +++ b/src/main/java/com/magento/idea/magento2plugin/project/indexing/MagentoAdditionalLibraryRootsProvider.java @@ -7,6 +7,7 @@ import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.RootsChangeRescanningInfo; import com.intellij.openapi.roots.AdditionalLibraryRootsProvider; import com.intellij.openapi.roots.SyntheticLibrary; import com.intellij.openapi.roots.ex.ProjectRootManagerEx; @@ -51,8 +52,7 @@ public class MagentoAdditionalLibraryRootsProvider extends AdditionalLibraryRoot public static void refreshRoots(final @NotNull Project project) { WriteAction.run(() -> ProjectRootManagerEx.getInstanceEx(project).makeRootsChange( () -> { }, - false, - true + RootsChangeRescanningInfo.TOTAL_RESCAN )); } diff --git a/src/main/java/com/magento/idea/magento2plugin/util/GetPhpClassByFQN.java b/src/main/java/com/magento/idea/magento2plugin/util/GetPhpClassByFQN.java index a8224f133..0cfa8129c 100644 --- a/src/main/java/com/magento/idea/magento2plugin/util/GetPhpClassByFQN.java +++ b/src/main/java/com/magento/idea/magento2plugin/util/GetPhpClassByFQN.java @@ -24,7 +24,7 @@ public static GetPhpClassByFQN getInstance(Project project) { } public PhpClass execute(String targetClassName) { - return ReadAction.compute(() -> { + return ReadAction.computeBlocking(() -> { final PhpIndex phpIndex = PhpIndex.getInstance(project); final Collection interfaces = phpIndex.getInterfacesByFQN(targetClassName); if (!interfaces.isEmpty()) { diff --git a/src/main/java/com/magento/idea/magento2plugin/util/magento/MagentoVersionUtil.java b/src/main/java/com/magento/idea/magento2plugin/util/magento/MagentoVersionUtil.java index c8928ac52..531d4ac79 100644 --- a/src/main/java/com/magento/idea/magento2plugin/util/magento/MagentoVersionUtil.java +++ b/src/main/java/com/magento/idea/magento2plugin/util/magento/MagentoVersionUtil.java @@ -53,7 +53,7 @@ public static Pair getVersionData( final Project project, final String magentoPath ) { - return ReadAction.compute(() -> { + return ReadAction.computeBlocking(() -> { final VirtualFile file = LocalFileSystem.getInstance().findFileByPath( getFilePath(magentoPath) ); diff --git a/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoCliToolQueries.kt b/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoCliToolQueries.kt index e56e19183..b6484d359 100644 --- a/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoCliToolQueries.kt +++ b/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoCliToolQueries.kt @@ -381,7 +381,7 @@ internal object MagentoCliToolQueries { } } - val projectRootName = (project.baseDir ?: project.projectFile?.parent)?.name + val projectRootName = project.projectFile?.parent?.name val configuredSegments = normalizedConfiguredPath .removePrefix("/") .removePrefix("./") @@ -469,7 +469,7 @@ internal object MagentoCliToolQueries { } private fun projectRootPath(project: Project): Path? { - val projectBasePath = project.basePath ?: project.baseDir?.path ?: return null + val projectBasePath = project.basePath ?: project.projectFile?.parent?.path ?: return null return Path.of(projectBasePath).toAbsolutePath().normalize() } diff --git a/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoModuleCommands.kt b/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoModuleCommands.kt index e12ff2d84..b16be52c1 100644 --- a/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoModuleCommands.kt +++ b/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoModuleCommands.kt @@ -75,7 +75,7 @@ internal object MagentoModuleCommands { val moduleFullName = "${normalizedPackage}_${normalizedModule}" - val existingModuleDirectory = ReadAction.compute { + val existingModuleDirectory = ReadAction.computeBlocking { magentoRootDirectory.findSubdirectory("app") ?.findSubdirectory("code") ?.findSubdirectory(normalizedPackage) @@ -233,7 +233,7 @@ internal object MagentoModuleCommands { name: String, directoryGenerator: DirectoryGenerator ): DirectoryCreationResult { - val existing = ReadAction.compute { + val existing = ReadAction.computeBlocking { parent.findSubdirectory(name) } if (existing != null) { @@ -274,7 +274,7 @@ internal object MagentoModuleCommands { } private fun resolveMagentoRootDirectory(project: Project, configuredRoot: String): PsiDirectory? { - return ReadAction.compute { + return ReadAction.computeBlocking { val fileSystem = LocalFileSystem.getInstance() val normalizedConfiguredRoot = FileUtil.toSystemIndependentName(configuredRoot.trim()) @@ -282,7 +282,7 @@ internal object MagentoModuleCommands { val absoluteVirtualFile = fileSystem.refreshAndFindFileByPath(normalizedConfiguredRoot) ?: fileSystem.findFileByPath(normalizedConfiguredRoot) if (absoluteVirtualFile != null && absoluteVirtualFile.isDirectory) { - return@compute PsiManager.getInstance(project).findDirectory(absoluteVirtualFile) + return@computeBlocking PsiManager.getInstance(project).findDirectory(absoluteVirtualFile) } } @@ -296,14 +296,14 @@ internal object MagentoModuleCommands { val resolvedRoot = moduleDirectory.parentDirectory(levels = 4) ?: continue val resolvedRootPath = resolvedRoot.virtualFile.path.replace('\\', '/') if (modulePath.startsWith(configuredPrefix)) { - return@compute resolvedRoot + return@computeBlocking resolvedRoot } if (!isAbsolutePath(normalizedConfiguredRoot) && configuredRootTrimmed.isNotEmpty() && resolvedRootPath.endsWith("/$configuredRootTrimmed") ) { - return@compute resolvedRoot + return@computeBlocking resolvedRoot } } @@ -319,7 +319,7 @@ internal object MagentoModuleCommands { .mapNotNull { path -> fileSystem.refreshAndFindFileByPath(path) ?: fileSystem.findFileByPath(path) } .firstOrNull { it.isDirectory } if (virtualFile != null) { - return@compute PsiManager.getInstance(project).findDirectory(virtualFile) + return@computeBlocking PsiManager.getInstance(project).findDirectory(virtualFile) } null From cdc7860f6ec3743f3421d7c7fa2154cbc432f666 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Mon, 15 Jun 2026 09:06:18 +0300 Subject: [PATCH 2/3] 2026.2 API compatibility cleanup --- .../generation/generator/PhpFileGenerator.java | 7 ++++--- .../generator/util/DirectoryGenerator.java | 15 ++++++++++----- .../idea/magento2plugin/indexes/ModuleIndex.java | 9 +++++---- .../js/KnockoutTemplateLineMarkerProvider.java | 10 ---------- .../js/LineMarkerTargetPresentationUtil.java | 15 --------------- .../idea/magento2plugin/project/SettingsForm.java | 2 +- .../MagentoAdditionalLibraryRootsProvider.java | 13 +++++++++---- .../magento2plugin/util/GetPhpClassByFQN.java | 5 +++-- .../util/magento/MagentoVersionUtil.java | 5 +++-- .../magento2plugin/mcp/MagentoMcpCreateSupport.kt | 7 +------ .../mcp/MagentoMcpToolsetSupport.kt | 3 +-- .../magento2plugin/mcp/MagentoModuleCommands.kt | 15 +++++++-------- 12 files changed, 44 insertions(+), 62 deletions(-) diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/PhpFileGenerator.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/PhpFileGenerator.java index 5548040f6..f38a63e30 100644 --- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/PhpFileGenerator.java +++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/PhpFileGenerator.java @@ -5,7 +5,8 @@ package com.magento.idea.magento2plugin.actions.generation.generator; -import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiFile; @@ -68,7 +69,7 @@ public PhpFileGenerator( public PsiFile generate(final @NotNull String actionName) { file = getFile(); - final PhpClass phpClass = ReadAction.computeBlocking(() -> + final PhpClass phpClass = ApplicationManager.getApplication().runReadAction((Computable) () -> GetPhpClassByFQN.getInstance(project).execute(file.getClassFqn()) ); @@ -78,7 +79,7 @@ public PsiFile generate(final @NotNull String actionName) { return phpClass.getContainingFile(); } - final PsiDirectory moduleDirectory = ReadAction.computeBlocking(() -> + final PsiDirectory moduleDirectory = ApplicationManager.getApplication().runReadAction((Computable) () -> moduleIndex.getModuleDirectoryByModuleName(file.getModuleName()) ); diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DirectoryGenerator.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DirectoryGenerator.java index 7ea041267..ec40fbc44 100644 --- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DirectoryGenerator.java +++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DirectoryGenerator.java @@ -6,8 +6,8 @@ package com.magento.idea.magento2plugin.actions.generation.generator.util; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.application.WriteAction; +import com.intellij.openapi.util.Computable; import com.intellij.psi.PsiDirectory; import com.magento.idea.magento2plugin.actions.generation.generator.data.ModuleDirectoriesData; import com.magento.idea.magento2plugin.magento.packages.File; @@ -64,7 +64,9 @@ public PsiDirectory findOrCreateSubdirectory( final @NotNull PsiDirectory parent, final @NotNull String subdirName ) { - final PsiDirectory sub = ReadAction.computeBlocking(() -> parent.findSubdirectory(subdirName)); + final PsiDirectory sub = ApplicationManager.getApplication().runReadAction( + (Computable) () -> parent.findSubdirectory(subdirName) + ); return sub == null ? createSubdirectoryOnEdt(parent, subdirName) : sub; } @@ -85,7 +87,9 @@ public PsiDirectory findOrCreateSubdirectories( for (final String directory : Arrays.asList(directories)) { if (lastDirectory == null) { - final PsiDirectory subDir = ReadAction.computeBlocking(() -> parent.findSubdirectory(directory)); + final PsiDirectory subDir = ApplicationManager.getApplication().runReadAction( + (Computable) () -> parent.findSubdirectory(directory) + ); if (subDir == null) { lastDirectory = createSubdirectoryOnEdt(parent, directory); @@ -94,8 +98,9 @@ public PsiDirectory findOrCreateSubdirectories( } } else { final PsiDirectory currentDirectory = lastDirectory; - final PsiDirectory subDir = ReadAction.computeBlocking(() -> - currentDirectory.findSubdirectory(directory)); + final PsiDirectory subDir = ApplicationManager.getApplication().runReadAction( + (Computable) () -> currentDirectory.findSubdirectory(directory) + ); if (subDir == null) { final PsiDirectory finalLastDirectory = lastDirectory; diff --git a/src/main/java/com/magento/idea/magento2plugin/indexes/ModuleIndex.java b/src/main/java/com/magento/idea/magento2plugin/indexes/ModuleIndex.java index 2a825bbc6..5c9b67bc5 100644 --- a/src/main/java/com/magento/idea/magento2plugin/indexes/ModuleIndex.java +++ b/src/main/java/com/magento/idea/magento2plugin/indexes/ModuleIndex.java @@ -5,7 +5,8 @@ package com.magento.idea.magento2plugin.indexes; -import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; @@ -81,7 +82,7 @@ private List getNames( final ID indexKey, final boolean withinProject ) { - return ReadAction.computeBlocking(() -> { + return ApplicationManager.getApplication().runReadAction((Computable>) () -> { final Set names = new LinkedHashSet<>(); final FileBasedIndex index = FileBasedIndex.getInstance(); final Collection allNames = index.getAllKeys(indexKey, project); @@ -122,7 +123,7 @@ private List getNames( * @return PsiDirectory */ public @Nullable PsiDirectory getModuleDirectoryByModuleName(final String moduleName) { - return ReadAction.computeBlocking(() -> { + return ApplicationManager.getApplication().runReadAction((Computable) () -> { final VirtualFile moduleDirectory = getModuleDirectoryVirtualFileByModuleName(moduleName); if (moduleDirectory == null) { return null; @@ -140,7 +141,7 @@ private List getNames( * @return VirtualFile */ public @Nullable VirtualFile getModuleDirectoryVirtualFileByModuleName(final String moduleName) { - return ReadAction.computeBlocking(() -> { + return ApplicationManager.getApplication().runReadAction((Computable) () -> { if (moduleName == null) { return null; } diff --git a/src/main/java/com/magento/idea/magento2plugin/linemarker/js/KnockoutTemplateLineMarkerProvider.java b/src/main/java/com/magento/idea/magento2plugin/linemarker/js/KnockoutTemplateLineMarkerProvider.java index c7049a87f..d0ee750a0 100644 --- a/src/main/java/com/magento/idea/magento2plugin/linemarker/js/KnockoutTemplateLineMarkerProvider.java +++ b/src/main/java/com/magento/idea/magento2plugin/linemarker/js/KnockoutTemplateLineMarkerProvider.java @@ -159,7 +159,6 @@ private void addXmlComponentLineMarker( .create(JavaScriptFileType.INSTANCE.getIcon()) .setTargets(preparedTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) - .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) .setTooltipText(MAGENTO_UI_COMPONENT_TOOLTIP_TEXT) .createLineMarkerInfo( anchor, @@ -195,7 +194,6 @@ private void addXmlTemplateLineMarker( .create(HtmlFileType.INSTANCE.getIcon()) .setTargets(preparedTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) - .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) .setTooltipText(MAGENTO_TEMPLATE_TOOLTIP_TEXT) .createLineMarkerInfo( anchor, @@ -241,7 +239,6 @@ private void addLayoutTemplateLineMarker( .create(HtmlFileType.INSTANCE.getIcon()) .setTargets(LineMarkerTargetPresentationUtil.prepareTargets(targets)) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) - .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) .setTooltipText(TEMPLATE_TOOLTIP_TEXT) .createLineMarkerInfo(anchor)); } @@ -272,7 +269,6 @@ private void addLayoutDisplayAreaLineMarker( .create(HtmlFileType.INSTANCE.getIcon()) .setTargets(preparedTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) - .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) .setTooltipText(REGION_TEMPLATE_TOOLTIP_TEXT) .createLineMarkerInfo( anchor, @@ -328,7 +324,6 @@ private void addGetRegionLineMarkers( .create(HtmlFileType.INSTANCE.getIcon()) .setTargets(preparedTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) - .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) .setTooltipText(REGION_DISPLAY_AREA_TOOLTIP_TEXT) .createLineMarkerInfo( anchor, @@ -369,7 +364,6 @@ private boolean addLegacyGetRegionLineMarker( .create(HtmlFileType.INSTANCE.getIcon()) .setTargets(preparedChildTemplates) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) - .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) .setTooltipText(REGION_CHILD_TEMPLATE_TOOLTIP_TEXT) .createLineMarkerInfo( anchor, @@ -386,7 +380,6 @@ private boolean addLegacyGetRegionLineMarker( .create(JavaScriptFileType.INSTANCE.getIcon()) .setTargets(preparedComponentTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) - .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) .setTooltipText(REGION_COMPONENT_TOOLTIP_TEXT) .createLineMarkerInfo( anchor, @@ -425,7 +418,6 @@ private void addDisplayAreaLineMarkers( .create(HtmlFileType.INSTANCE.getIcon()) .setTargets(preparedTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) - .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) .setTooltipText(REGION_TEMPLATE_TOOLTIP_TEXT) .createLineMarkerInfo( anchor, @@ -486,7 +478,6 @@ private void addDisplayAreaLineMarkers( : XmlFileType.INSTANCE.getIcon()) .setTargets(preparedTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) - .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) .setTooltipText(tooltip) .createLineMarkerInfo( anchor, @@ -515,7 +506,6 @@ private void addDisplayAreaLineMarkers( : XmlFileType.INSTANCE.getIcon()) .setTargets(preparedTargets) .setNamer(LineMarkerTargetPresentationUtil::getPresentableTargetName) - .setTargetRenderer(LineMarkerTargetPresentationUtil.TARGET_RENDERER) .setTooltipText(tooltip) .createLineMarkerInfo( anchor, diff --git a/src/main/java/com/magento/idea/magento2plugin/linemarker/js/LineMarkerTargetPresentationUtil.java b/src/main/java/com/magento/idea/magento2plugin/linemarker/js/LineMarkerTargetPresentationUtil.java index 409a5b7a6..2ecceb83e 100644 --- a/src/main/java/com/magento/idea/magento2plugin/linemarker/js/LineMarkerTargetPresentationUtil.java +++ b/src/main/java/com/magento/idea/magento2plugin/linemarker/js/LineMarkerTargetPresentationUtil.java @@ -8,7 +8,6 @@ import com.intellij.codeInsight.daemon.GutterIconNavigationHandler; import com.intellij.codeInsight.navigation.NavigationUtil; import com.intellij.codeInsight.navigation.PsiTargetNavigator; -import com.intellij.codeInsight.navigation.impl.PsiTargetPresentationRenderer; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Iconable; import com.intellij.openapi.ui.popup.JBPopup; @@ -22,24 +21,10 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.function.Supplier; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public final class LineMarkerTargetPresentationUtil { - static final Supplier> TARGET_RENDERER = - () -> new PsiTargetPresentationRenderer<>() { - @Override - public String getElementText(final PsiElement element) { - return getPresentableTargetName(element); - } - - @Override - public String getContainerText(final PsiElement element) { - return null; - } - }; - private LineMarkerTargetPresentationUtil() { } diff --git a/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java b/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java index 88fc1c578..166698c85 100644 --- a/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java +++ b/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java @@ -179,7 +179,7 @@ private void installMagentoSkill(final Skill skill) { ); } catch (final IOException | IllegalStateException exception) { final String errorMessage = StringUtil.notNullize( - exception.getMessage(), + exception.getLocalizedMessage(), exception.getClass().getSimpleName() ); MagentoNotificationUtil.notifyGlobally( diff --git a/src/main/java/com/magento/idea/magento2plugin/project/indexing/MagentoAdditionalLibraryRootsProvider.java b/src/main/java/com/magento/idea/magento2plugin/project/indexing/MagentoAdditionalLibraryRootsProvider.java index f6e5ff83e..ac47ed367 100644 --- a/src/main/java/com/magento/idea/magento2plugin/project/indexing/MagentoAdditionalLibraryRootsProvider.java +++ b/src/main/java/com/magento/idea/magento2plugin/project/indexing/MagentoAdditionalLibraryRootsProvider.java @@ -50,10 +50,15 @@ public class MagentoAdditionalLibraryRootsProvider extends AdditionalLibraryRoot } public static void refreshRoots(final @NotNull Project project) { - WriteAction.run(() -> ProjectRootManagerEx.getInstanceEx(project).makeRootsChange( - () -> { }, - RootsChangeRescanningInfo.TOTAL_RESCAN - )); + WriteAction.run(() -> { + try (AutoCloseable ignored = ProjectRootManagerEx + .getInstanceEx(project) + .withRootsChange(RootsChangeRescanningInfo.TOTAL_RESCAN)) { + // The roots are provided from settings; closing this scope publishes the refresh. + } catch (final Exception exception) { + throw new IllegalStateException("Unable to refresh Magento index roots.", exception); + } + }); } private @NotNull Collection getMagentoIndexRoots(final @NotNull Project project) { diff --git a/src/main/java/com/magento/idea/magento2plugin/util/GetPhpClassByFQN.java b/src/main/java/com/magento/idea/magento2plugin/util/GetPhpClassByFQN.java index 0cfa8129c..707f138bc 100644 --- a/src/main/java/com/magento/idea/magento2plugin/util/GetPhpClassByFQN.java +++ b/src/main/java/com/magento/idea/magento2plugin/util/GetPhpClassByFQN.java @@ -4,8 +4,9 @@ */ package com.magento.idea.magento2plugin.util; -import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Computable; import com.jetbrains.php.PhpIndex; import com.jetbrains.php.lang.psi.elements.PhpClass; @@ -24,7 +25,7 @@ public static GetPhpClassByFQN getInstance(Project project) { } public PhpClass execute(String targetClassName) { - return ReadAction.computeBlocking(() -> { + return ApplicationManager.getApplication().runReadAction((Computable) () -> { final PhpIndex phpIndex = PhpIndex.getInstance(project); final Collection interfaces = phpIndex.getInterfacesByFQN(targetClassName); if (!interfaces.isEmpty()) { diff --git a/src/main/java/com/magento/idea/magento2plugin/util/magento/MagentoVersionUtil.java b/src/main/java/com/magento/idea/magento2plugin/util/magento/MagentoVersionUtil.java index 531d4ac79..107a4a4a5 100644 --- a/src/main/java/com/magento/idea/magento2plugin/util/magento/MagentoVersionUtil.java +++ b/src/main/java/com/magento/idea/magento2plugin/util/magento/MagentoVersionUtil.java @@ -7,8 +7,9 @@ import com.intellij.json.psi.JsonFile; import com.intellij.json.psi.JsonObject; -import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; @@ -53,7 +54,7 @@ public static Pair getVersionData( final Project project, final String magentoPath ) { - return ReadAction.computeBlocking(() -> { + return ApplicationManager.getApplication().runReadAction((Computable>) () -> { final VirtualFile file = LocalFileSystem.getInstance().findFileByPath( getFilePath(magentoPath) ); diff --git a/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoMcpCreateSupport.kt b/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoMcpCreateSupport.kt index c7cf44a1e..5b7fb3228 100644 --- a/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoMcpCreateSupport.kt +++ b/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoMcpCreateSupport.kt @@ -6,7 +6,6 @@ package com.magento.idea.magento2plugin.mcp import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.application.ReadAction import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.LocalFileSystem @@ -25,11 +24,7 @@ internal object MagentoMcpCreateSupport { private val DIRECTORY_PATTERN = Regex(RegExUtil.DIRECTORY) fun runReadAction(action: () -> T): T { - return if (ApplicationManager.getApplication().isDispatchThread) { - ApplicationManager.getApplication().runReadAction { action() } - } else { - ReadAction.computeCancellable(action) - } + return ApplicationManager.getApplication().runReadAction { action() } } fun requireEditableModule( diff --git a/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoMcpToolsetSupport.kt b/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoMcpToolsetSupport.kt index 1625f9905..1b2d940ab 100644 --- a/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoMcpToolsetSupport.kt +++ b/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoMcpToolsetSupport.kt @@ -6,7 +6,6 @@ package com.magento.idea.magento2plugin.mcp import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.application.ReadAction import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.Project import com.magento.idea.magento2plugin.project.Settings @@ -48,7 +47,7 @@ internal object MagentoMcpToolsetSupport { ): String = withProjectAction(validateProject, requireSmartMode) { project -> try { MagentoMcpReadActionSupport.retryOnCancellation { - ReadAction.computeCancellable { + ApplicationManager.getApplication().runReadAction { query(project) } } diff --git a/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoModuleCommands.kt b/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoModuleCommands.kt index b16be52c1..950dbb372 100644 --- a/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoModuleCommands.kt +++ b/src/main/kotlin/com/magento/idea/magento2plugin/mcp/MagentoModuleCommands.kt @@ -5,7 +5,6 @@ package com.magento.idea.magento2plugin.mcp -import com.intellij.openapi.application.ReadAction import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.WriteAction import com.intellij.openapi.project.Project @@ -75,7 +74,7 @@ internal object MagentoModuleCommands { val moduleFullName = "${normalizedPackage}_${normalizedModule}" - val existingModuleDirectory = ReadAction.computeBlocking { + val existingModuleDirectory = ApplicationManager.getApplication().runReadAction { magentoRootDirectory.findSubdirectory("app") ?.findSubdirectory("code") ?.findSubdirectory(normalizedPackage) @@ -233,7 +232,7 @@ internal object MagentoModuleCommands { name: String, directoryGenerator: DirectoryGenerator ): DirectoryCreationResult { - val existing = ReadAction.computeBlocking { + val existing = ApplicationManager.getApplication().runReadAction { parent.findSubdirectory(name) } if (existing != null) { @@ -274,7 +273,7 @@ internal object MagentoModuleCommands { } private fun resolveMagentoRootDirectory(project: Project, configuredRoot: String): PsiDirectory? { - return ReadAction.computeBlocking { + return ApplicationManager.getApplication().runReadAction { val fileSystem = LocalFileSystem.getInstance() val normalizedConfiguredRoot = FileUtil.toSystemIndependentName(configuredRoot.trim()) @@ -282,7 +281,7 @@ internal object MagentoModuleCommands { val absoluteVirtualFile = fileSystem.refreshAndFindFileByPath(normalizedConfiguredRoot) ?: fileSystem.findFileByPath(normalizedConfiguredRoot) if (absoluteVirtualFile != null && absoluteVirtualFile.isDirectory) { - return@computeBlocking PsiManager.getInstance(project).findDirectory(absoluteVirtualFile) + return@runReadAction PsiManager.getInstance(project).findDirectory(absoluteVirtualFile) } } @@ -296,14 +295,14 @@ internal object MagentoModuleCommands { val resolvedRoot = moduleDirectory.parentDirectory(levels = 4) ?: continue val resolvedRootPath = resolvedRoot.virtualFile.path.replace('\\', '/') if (modulePath.startsWith(configuredPrefix)) { - return@computeBlocking resolvedRoot + return@runReadAction resolvedRoot } if (!isAbsolutePath(normalizedConfiguredRoot) && configuredRootTrimmed.isNotEmpty() && resolvedRootPath.endsWith("/$configuredRootTrimmed") ) { - return@computeBlocking resolvedRoot + return@runReadAction resolvedRoot } } @@ -319,7 +318,7 @@ internal object MagentoModuleCommands { .mapNotNull { path -> fileSystem.refreshAndFindFileByPath(path) ?: fileSystem.findFileByPath(path) } .firstOrNull { it.isDirectory } if (virtualFile != null) { - return@computeBlocking PsiManager.getInstance(project).findDirectory(virtualFile) + return@runReadAction PsiManager.getInstance(project).findDirectory(virtualFile) } null From 23a5b046c2c41a86aba9050c67facde116140509 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Mon, 15 Jun 2026 11:41:46 +0300 Subject: [PATCH 3/3] Fixed tests --- .../highlighting/MagentoInitJsonErrorFilter.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/magento/idea/magento2plugin/highlighting/MagentoInitJsonErrorFilter.java b/src/main/java/com/magento/idea/magento2plugin/highlighting/MagentoInitJsonErrorFilter.java index 66f58d85e..363ab47d8 100644 --- a/src/main/java/com/magento/idea/magento2plugin/highlighting/MagentoInitJsonErrorFilter.java +++ b/src/main/java/com/magento/idea/magento2plugin/highlighting/MagentoInitJsonErrorFilter.java @@ -41,10 +41,13 @@ public boolean shouldHighlightErrorElement(final @NotNull PsiErrorElement elemen } @Override - public boolean accept(final @NotNull HighlightInfo highlightInfo, final PsiFile file) { + public boolean accept(final @NotNull HighlightInfo highlightInfo, final @Nullable PsiFile file) { if (!HighlightSeverity.ERROR.equals(highlightInfo.getSeverity())) { return true; } + if (file == null) { + return true; + } final PsiLanguageInjectionHost host = findInjectedJsonHost(file, highlightInfo.getStartOffset()); return !shouldSuppressMagentoInitPhpJsonNoise(host);