diff --git a/platform/core-impl/src/com/intellij/psi/impl/PsiDocumentManagerBase.java b/platform/core-impl/src/com/intellij/psi/impl/PsiDocumentManagerBase.java index 9213cd37935e..2dd33351593e 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/PsiDocumentManagerBase.java +++ b/platform/core-impl/src/com/intellij/psi/impl/PsiDocumentManagerBase.java @@ -12,6 +12,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.DocumentRunnable; import com.intellij.openapi.editor.event.DocumentEvent; +import com.intellij.openapi.editor.event.DocumentListener; import com.intellij.openapi.editor.ex.DocumentEx; import com.intellij.openapi.editor.ex.PrioritizedInternalDocumentListener; import com.intellij.openapi.editor.impl.DocumentImpl; @@ -45,7 +46,7 @@ import javax.swing.*; import java.util.*; import java.util.concurrent.ConcurrentMap; -public abstract class PsiDocumentManagerBase extends PsiDocumentManager implements PrioritizedInternalDocumentListener, Disposable { +public abstract class PsiDocumentManagerBase extends PsiDocumentManager implements DocumentListener, Disposable { static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.PsiDocumentManagerImpl"); private static final Key HARD_REF_TO_DOCUMENT = Key.create("HARD_REFERENCE_TO_DOCUMENT"); private static final Key> ACTION_AFTER_COMMIT = Key.create("ACTION_AFTER_COMMIT"); @@ -74,12 +75,8 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen mySynchronizer = new PsiToDocumentSynchronizer(this, bus); myPsiManager.addPsiTreeChangeListener(mySynchronizer); - bus.connect(this).subscribe(PsiDocumentTransactionListener.TOPIC, new PsiDocumentTransactionListener() { - @Override - public void transactionStarted(@NotNull Document document, @NotNull PsiFile file) { - myUncommittedDocuments.remove(document); - } - }); + bus.connect(this).subscribe(PsiDocumentTransactionListener.TOPIC, + (document, file) -> myUncommittedDocuments.remove(document)); } @Override @@ -806,11 +803,6 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen final Document document = event.getDocument(); - UncommittedInfo info = myUncommittedInfos.get(document); - if (info != null) { - info.myEvents.add(event); - } - VirtualFile virtualFile = FileDocumentManager.getInstance().getFile(document); boolean isRelevant = virtualFile != null && isRelevant(virtualFile); @@ -859,16 +851,26 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen } } - @Override - public int getPriority() { - return EditorDocumentPriorities.RANGE_MARKER; - } + class PriorityEventCollector implements PrioritizedInternalDocumentListener { + @Override + public int getPriority() { + return EditorDocumentPriorities.RANGE_MARKER; + } - @Override - public void moveTextHappened(@NotNull Document document, int start, int end, int base) { - UncommittedInfo info = myUncommittedInfos.get(document); - if (info != null) { - info.myEvents.add(new RetargetRangeMarkers(document, start, end, base)); + @Override + public void moveTextHappened(@NotNull Document document, int start, int end, int base) { + UncommittedInfo info = myUncommittedInfos.get(document); + if (info != null) { + info.myEvents.add(new RetargetRangeMarkers(document, start, end, base)); + } + } + + @Override + public void documentChanged(@NotNull DocumentEvent event) { + UncommittedInfo info = myUncommittedInfos.get(event.getDocument()); + if (info != null) { + info.myEvents.add(event); + } } } @@ -885,13 +887,10 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen myUncommittedDocuments.remove(document); VirtualFile virtualFile = FileDocumentManager.getInstance().getFile(document); - if (virtualFile == null || !FileIndexFacade.getInstance(myProject).isInContent(virtualFile)) { - runAfterCommitActions(document); - return; - } - - final PsiFile psiFile = getPsiFile(document); - if (psiFile == null) { + final PsiFile psiFile; + if (virtualFile == null || + !FileIndexFacade.getInstance(myProject).isInContent(virtualFile) || + (psiFile = getPsiFile(document)) == null) { runAfterCommitActions(document); return; } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/BraceHighlightingHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/BraceHighlightingHandler.java index 509519dc3904..25cb3dfc3726 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/BraceHighlightingHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/BraceHighlightingHandler.java @@ -12,7 +12,6 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ex.ApplicationManagerEx; import com.intellij.openapi.application.impl.ApplicationImpl; -import com.intellij.openapi.editor.CaretModel; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.LogicalPosition; @@ -103,14 +102,7 @@ public class BraceHighlightingHandler { // any request to the UI component need to be done from EDT final ModalityState modalityState = ModalityState.stateForComponent(editor.getComponent()); - CaretModel model = editor.getCaretModel(); - if (!model.isUpToDate()) { - // happened to be called from typed handler - // restart to avoid dreaded "Caret model is in its update process. All requests are illegal at this point." - restartLater(editor, modalityState, alarm, processor); - return; - } - final int offset = model.getOffset(); + final int offset = editor.getCaretModel().getOffset(); ApplicationManager.getApplication().executeOnPooledThread(() -> { boolean success = ApplicationManagerEx.getApplicationEx().tryRunReadAction(() -> { diff --git a/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java index ed55d2c1f018..8d2f1c9dd126 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java @@ -58,7 +58,8 @@ public class PsiDocumentManagerImpl extends PsiDocumentManagerBase { @NotNull final DocumentCommitProcessor documentCommitThread) { super(project, psiManager, bus, documentCommitThread); myDocumentCommitThread = documentCommitThread; - ((EditorEventMulticasterEx)editorFactory.getEventMulticaster()).addPrioritizedDocumentListener(this, project); + editorFactory.getEventMulticaster().addDocumentListener(this, project); + ((EditorEventMulticasterEx)editorFactory.getEventMulticaster()).addPrioritizedDocumentListener(new PriorityEventCollector(), project); MessageBusConnection connection = bus.connect(this); connection.subscribe(AppTopics.FILE_DOCUMENT_SYNC, new FileDocumentManagerListener() { @Override