From cac49fccf1da6b7580a54fba23d47bd64c4cba6e Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 5 May 2017 15:47:01 +0200 Subject: [PATCH] restart async editor loading if the document is not committed (EA-93653 - assert: PsiDocumentManagerBase.commitDocument) --- .../fileEditor/impl/text/AsyncEditorLoader.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/AsyncEditorLoader.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/AsyncEditorLoader.java index 43fdaf6d3296..e122356585ad 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/AsyncEditorLoader.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/AsyncEditorLoader.java @@ -17,6 +17,7 @@ package com.intellij.openapi.fileEditor.impl.text; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.FileEditorStateLevel; @@ -35,6 +36,7 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; +import java.util.function.BooleanSupplier; public class AsyncEditorLoader { private static final ExecutorService ourExecutor = AppExecutorUtil.createBoundedApplicationPoolExecutor("AsyncEditorLoader pool", 2); @@ -88,7 +90,11 @@ public class AsyncEditorLoader { private Future scheduleLoading() { PsiDocumentManager psiDocumentManager = PsiDocumentManager.getInstance(myProject); - long startStamp = myEditor.getDocument().getModificationStamp(); + Document document = myEditor.getDocument(); + long startStamp = document.getModificationStamp(); + BooleanSupplier psiDocumentRemainSame = () -> + startStamp == document.getModificationStamp() && + psiDocumentManager.isCommitted(document); // undo after document change restores stamp but keeps PSI changed, hence additional check return ourExecutor.submit(() -> { Ref ref = new Ref<>(); try { @@ -101,7 +107,7 @@ public class AsyncEditorLoader { Runnable continuation = ref.get(); if (continuation != null) { invokeLater(() -> { - if (startStamp == myEditor.getDocument().getModificationStamp()) loadingFinished(continuation); + if (psiDocumentRemainSame.getAsBoolean()) loadingFinished(continuation); else if (!myProject.isDisposed() && !myEditorComponent.isDisposed()) scheduleLoading(); }); return continuation;