run (before)documentChanged() at the regular priority to give user listeners access to the various subsystems (like folding, caret) which are updated at lower priorities

This commit is contained in:
Alexey Kudravtsev
2018-09-04 13:05:17 +03:00
parent 242164d428
commit eab08da195
3 changed files with 30 additions and 38 deletions
@@ -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<Document> HARD_REF_TO_DOCUMENT = Key.create("HARD_REFERENCE_TO_DOCUMENT");
private static final Key<List<Runnable>> 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;
}
@@ -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(() -> {
@@ -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