diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/AsyncHighlighterUpdater.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/AsyncHighlighterUpdater.java index a5a8a5f1c68c..c155f3c0c009 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/AsyncHighlighterUpdater.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/AsyncHighlighterUpdater.java @@ -32,7 +32,7 @@ import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.TestOnly; -import java.util.Set; +import java.util.Map; import java.util.concurrent.*; /** @@ -40,7 +40,7 @@ import java.util.concurrent.*; */ public class AsyncHighlighterUpdater extends ReadTask { private static final ExecutorService ourExecutor = AppExecutorUtil.createBoundedApplicationPoolExecutor("AsyncEditorLoader pool", 2); - private static final Set> ourHighlighterFutures = ContainerUtil.newConcurrentSet(); + private static final Map> ourHighlighterFutures = ContainerUtil.newConcurrentMap(); private final Project myProject; private final Editor myEditor; private final VirtualFile myFile; @@ -72,15 +72,18 @@ public class AsyncHighlighterUpdater extends ReadTask { AsyncHighlighterUpdater task = new AsyncHighlighterUpdater(project, editor, file); if (task.isEverythingValid()) { CompletableFuture future = ProgressIndicatorUtils.scheduleWithWriteActionPriority(ourExecutor, task); - ourHighlighterFutures.add(future); - future.whenComplete((a, b) -> ourHighlighterFutures.remove(future)); + Future prev = ourHighlighterFutures.put(editor, future); + if (prev != null) { + prev.cancel(false); + } + future.whenComplete((a, b) -> ourHighlighterFutures.remove(editor, future)); } } @TestOnly public static void completeAsyncTasks() { assert !ApplicationManager.getApplication().isWriteAccessAllowed(); - ApplicationManager.getApplication().invokeAndWait(() -> ourHighlighterFutures.forEach(AsyncHighlighterUpdater::waitForFuture)); + ApplicationManager.getApplication().invokeAndWait(() -> ourHighlighterFutures.values().forEach(AsyncHighlighterUpdater::waitForFuture)); UIUtil.dispatchAllInvocationEvents(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressIndicatorUtils.java b/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressIndicatorUtils.java index 2dfacec9cb38..94a0ea41ed80 100644 --- a/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressIndicatorUtils.java +++ b/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressIndicatorUtils.java @@ -202,13 +202,13 @@ public class ProgressIndicatorUtils { if (continuation == null) { future.complete(null); } - else { + else if (!future.isCancelled()) { application.invokeLater(new Runnable() { @Override public void run() { application.removeApplicationListener(listener); // remove listener early to prevent firing it during continuation execution try { - if (!progressIndicator.isCanceled()) { + if (!progressIndicator.isCanceled() && !future.isCancelled()) { continuation.getAction().run(); } }