From 287c81468f558a4da7bddd54378b67a2c7f17184 Mon Sep 17 00:00:00 2001 From: Volodymyr Spodaryk Date: Fri, 26 Jun 2026 00:39:41 +0300 Subject: [PATCH] fix: wrap FilenameIndex lookups in ReadAction to fix read-access crash on newer IDEs --- .../uom/lefterisxris/codetour/tours/service/Navigator.java | 7 ++++--- .../uom/lefterisxris/codetour/tours/state/Validator.java | 5 +++-- .../uom/lefterisxris/codetour/tours/ui/ToolPaneWindow.java | 5 +++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/uom/lefterisxris/codetour/tours/service/Navigator.java b/src/main/java/org/uom/lefterisxris/codetour/tours/service/Navigator.java index 86b25fd..975b88a 100644 --- a/src/main/java/org/uom/lefterisxris/codetour/tours/service/Navigator.java +++ b/src/main/java/org/uom/lefterisxris/codetour/tours/service/Navigator.java @@ -1,5 +1,6 @@ package org.uom.lefterisxris.codetour.tours.service; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.JBPopupFactory; @@ -38,12 +39,12 @@ public static void navigate(@NotNull Step step, @NotNull Project project) { return; } - // Try finding the appropriate file to navigate to + // Try finding the appropriate file to navigate to. The index lookup requires a read action final String stepFileName = Paths.get(step.getFile()).getFileName().toString(); - final List validVirtualFiles = FilenameIndex + final List validVirtualFiles = ReadAction.compute(() -> FilenameIndex .getVirtualFilesByName(stepFileName, GlobalSearchScope.projectScope(project)).stream() .filter(file -> Utils.isFileMatchesStep(file, step)) - .collect(Collectors.toList()); + .collect(Collectors.toList())); if (validVirtualFiles.isEmpty()) { // Case for configured but not found file diff --git a/src/main/java/org/uom/lefterisxris/codetour/tours/state/Validator.java b/src/main/java/org/uom/lefterisxris/codetour/tours/state/Validator.java index bf0463d..e9c5c94 100644 --- a/src/main/java/org/uom/lefterisxris/codetour/tours/state/Validator.java +++ b/src/main/java/org/uom/lefterisxris/codetour/tours/state/Validator.java @@ -1,5 +1,6 @@ package org.uom.lefterisxris.codetour.tours.state; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageDialogBuilder; @@ -41,10 +42,10 @@ public static void validateTours(@NotNull Project project, List tours) { // Try finding the appropriate file final String stepFileName = Paths.get(step.getFile()).getFileName().toString(); - final List validVirtualFiles = FilenameIndex + final List validVirtualFiles = ReadAction.compute(() -> FilenameIndex .getVirtualFilesByName(stepFileName, GlobalSearchScope.projectScope(project)).stream() .filter(file -> Utils.isFileMatchesStep(file, step)) - .collect(Collectors.toList()); + .collect(Collectors.toList())); if (validVirtualFiles.isEmpty()) errors.add(String.format("Step '%s' of Tour '%s' points to a non valid file: '%s'!\n", diff --git a/src/main/java/org/uom/lefterisxris/codetour/tours/ui/ToolPaneWindow.java b/src/main/java/org/uom/lefterisxris/codetour/tours/ui/ToolPaneWindow.java index f0d0382..a433cfb 100644 --- a/src/main/java/org/uom/lefterisxris/codetour/tours/ui/ToolPaneWindow.java +++ b/src/main/java/org/uom/lefterisxris/codetour/tours/ui/ToolPaneWindow.java @@ -1,6 +1,7 @@ package org.uom.lefterisxris.codetour.tours.ui; import com.intellij.icons.AllIcons; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.project.Project; @@ -400,8 +401,8 @@ private void editTourListener(Tour tour) { private void jumpToSourceTourListener(Tour tour) { SlowOperations.allowSlowOperations(() -> { - final Collection virtualFiles = FilenameIndex.getVirtualFilesByName(tour.getTourFile(), - GlobalSearchScope.projectScope(project)); + final Collection virtualFiles = ReadAction.compute(() -> + FilenameIndex.getVirtualFilesByName(tour.getTourFile(), GlobalSearchScope.projectScope(project))); final Optional virtualFile = virtualFiles.stream() .filter(file -> !file.isDirectory() && file.getName().equals(tour.getTourFile())) .findFirst();