diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/EditorTrackerImpl.kt b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/EditorTrackerImpl.kt index 12e01a6777fd..f53fcbc580a4 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/EditorTrackerImpl.kt +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/EditorTrackerImpl.kt @@ -2,6 +2,9 @@ package com.intellij.codeInsight.daemon.impl import com.intellij.openapi.Disposable +import com.intellij.openapi.application.ReadAction +import com.intellij.openapi.application.readAction +import com.intellij.openapi.application.runReadAction import com.intellij.openapi.components.service import com.intellij.openapi.diagnostic.debug import com.intellij.openapi.diagnostic.logger @@ -18,6 +21,7 @@ import com.intellij.openapi.wm.WindowManager import com.intellij.openapi.wm.impl.IdeFrameImpl import com.intellij.openapi.wm.impl.ProjectFrameHelper import com.intellij.psi.PsiDocumentManager +import com.intellij.psi.PsiFile import com.intellij.util.concurrency.annotations.RequiresEdt import java.awt.Window import java.awt.event.WindowAdapter @@ -87,7 +91,8 @@ open class EditorTrackerImpl(@JvmField protected val project: Project) : EditorT override fun editorCreated(event: EditorFactoryEvent) { val editor = event.editor val project = editor.project?.takeIf { !it.isDisposed } ?: return - if (PsiDocumentManager.getInstance(project).getPsiFile(editor.document) != null) { + val psi = runReadAction { PsiDocumentManager.getInstance(project).getPsiFile(editor.document) } + if (psi != null) { getInstance(project).createEditorImpl(editor = editor, project = project) } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 93ed91ade8af..422c3c83c4b5 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -999,10 +999,11 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi myIgnoreMouseEventsConsecutiveToInitial = true; } - myCaretModel.updateVisualPosition(); - - // make sure carets won't appear at invalid positions (e.g., on Tab width change) - getCaretModel().doWithCaretMerging(() -> myCaretModel.getAllCarets().forEach(caret -> caret.moveToOffset(caret.getOffset()))); + ReadAction.run(() -> { + myCaretModel.updateVisualPosition(); + // make sure carets won't appear at invalid positions (e.g., on Tab width change) + getCaretModel().doWithCaretMerging(() -> myCaretModel.getAllCarets().forEach(caret -> caret.moveToOffset(caret.getOffset()))); + }); if (myVirtualFile != null && myProject != null) { EditorNotifications.getInstance(myProject).updateNotifications(myVirtualFile); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorView.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorView.java index 2b4cc0d3adad..14e2051ef895 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorView.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorView.java @@ -5,6 +5,7 @@ import com.intellij.diagnostic.Dumpable; import com.intellij.ide.ui.UISettings; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.CustomFoldRegion; import com.intellij.openapi.editor.FoldRegion; @@ -666,9 +667,11 @@ public final class EditorView implements TextDrawingCallback, Disposable, Dumpab } private void invalidateFoldRegionLayouts() { - for (FoldRegion region : myEditor.getFoldingModel().getAllFoldRegions()) { - invalidateFoldRegionLayout(region); - } + ReadAction.run(() -> { + for (FoldRegion region : myEditor.getFoldingModel().getAllFoldRegions()) { + invalidateFoldRegionLayout(region); + } + }); } public void invalidateFoldRegionLayout(FoldRegion region) { diff --git a/platform/platform-impl/src/com/intellij/ui/EditorTextField.java b/platform/platform-impl/src/com/intellij/ui/EditorTextField.java index 1da60a2b2d66..8779fa66647e 100644 --- a/platform/platform-impl/src/com/intellij/ui/EditorTextField.java +++ b/platform/platform-impl/src/com/intellij/ui/EditorTextField.java @@ -13,6 +13,7 @@ import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.UndoConfirmationPolicy; import com.intellij.openapi.command.impl.UndoManagerImpl; @@ -622,7 +623,7 @@ public class EditorTextField extends NonOpaquePanel implements EditorTextCompone editor.setCaretEnabled(!myIsViewer); if (project != null) { - PsiFile psiFile = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()); + PsiFile psiFile = ReadAction.compute(() -> PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument())); if (psiFile != null) { DaemonCodeAnalyzer.getInstance(project).setHighlightingEnabled(psiFile, !myIsViewer); } @@ -636,44 +637,46 @@ public class EditorTextField extends NonOpaquePanel implements EditorTextCompone if (highlighter != null) editor.setHighlighter(highlighter); } - editor.getSettings().setCaretRowShown(false); + ReadAction.run(() -> { + editor.getSettings().setCaretRowShown(false); - editor.setOneLineMode(myOneLineMode); - editor.getCaretModel().moveToOffset(document.getTextLength()); + editor.setOneLineMode(myOneLineMode); + editor.getCaretModel().moveToOffset(document.getTextLength()); - if (!shouldHaveBorder()) { - editor.setBorder(null); - } + if (!shouldHaveBorder()) { + editor.setBorder(null); + } - if (myIsViewer) { - editor.getSelectionModel().removeSelection(); - } - else if (myWholeTextSelected) { - doSelectAll(editor); - myWholeTextSelected = false; - } + if (myIsViewer) { + editor.getSelectionModel().removeSelection(); + } + else if (myWholeTextSelected) { + doSelectAll(editor); + myWholeTextSelected = false; + } - editor.putUserData(SUPPLEMENTARY_KEY, myIsSupplementary); - editor.getContentComponent().setFocusCycleRoot(false); - editor.getContentComponent().addFocusListener(this); - editor.getContentComponent().addMouseListener(this); + editor.putUserData(SUPPLEMENTARY_KEY, myIsSupplementary); + editor.getContentComponent().setFocusCycleRoot(false); + editor.getContentComponent().addFocusListener(this); + editor.getContentComponent().addMouseListener(this); - editor.setPlaceholder(myHintText); - editor.setShowPlaceholderWhenFocused(myShowPlaceholderWhenFocused); + editor.setPlaceholder(myHintText); + editor.setShowPlaceholderWhenFocused(myShowPlaceholderWhenFocused); - initOneLineMode(editor); + initOneLineMode(editor); - if (myIsRendererWithSelection) { - ((EditorImpl)editor).setPaintSelection(true); - editor.getColorsScheme().setColor(EditorColors.SELECTION_BACKGROUND_COLOR, myRendererBg); - editor.getColorsScheme().setColor(EditorColors.SELECTION_FOREGROUND_COLOR, myRendererFg); - editor.getSelectionModel().setSelection(0, document.getTextLength()); - editor.setBackgroundColor(myRendererBg); - } + if (myIsRendererWithSelection) { + ((EditorImpl)editor).setPaintSelection(true); + editor.getColorsScheme().setColor(EditorColors.SELECTION_BACKGROUND_COLOR, myRendererBg); + editor.getColorsScheme().setColor(EditorColors.SELECTION_FOREGROUND_COLOR, myRendererFg); + editor.getSelectionModel().setSelection(0, document.getTextLength()); + editor.setBackgroundColor(myRendererBg); + } - for (EditorSettingsProvider provider : mySettingsProviders) { - provider.customizeSettings(editor); - } + for (EditorSettingsProvider provider : mySettingsProviders) { + provider.customizeSettings(editor); + } + }); return editor; } diff --git a/platform/platform-impl/src/com/intellij/util/textCompletion/TextFieldWithCompletion.java b/platform/platform-impl/src/com/intellij/util/textCompletion/TextFieldWithCompletion.java index 6795cdf7d833..4bf77f92e0e4 100644 --- a/platform/platform-impl/src/com/intellij/util/textCompletion/TextFieldWithCompletion.java +++ b/platform/platform-impl/src/com/intellij/util/textCompletion/TextFieldWithCompletion.java @@ -16,6 +16,7 @@ package com.intellij.util.textCompletion; import com.intellij.codeInsight.AutoPopupController; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.editor.SpellCheckingEditorCustomizationProvider; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.fileTypes.PlainTextLanguage; @@ -65,8 +66,12 @@ public class TextFieldWithCompletion extends LanguageTextField { @Override protected @NotNull EditorEx createEditor() { EditorEx editor = super.createEditor(); - EditorCustomization disableSpellChecking = SpellCheckingEditorCustomizationProvider.getInstance().getDisabledCustomization(); - if (disableSpellChecking != null) disableSpellChecking.customize(editor); + ReadAction.run(() -> { + EditorCustomization disableSpellChecking = SpellCheckingEditorCustomizationProvider.getInstance().getDisabledCustomization(); + if (disableSpellChecking != null) { + disableSpellChecking.customize(editor); + } + }); editor.putUserData(AutoPopupController.ALWAYS_AUTO_POPUP, myForceAutoPopup); if (myShowHint) { diff --git a/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/MarkdownInlayUpdateOnSoftWrapListener.kt b/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/MarkdownInlayUpdateOnSoftWrapListener.kt index 2f898c640719..0dc7c553a5b2 100644 --- a/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/MarkdownInlayUpdateOnSoftWrapListener.kt +++ b/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/MarkdownInlayUpdateOnSoftWrapListener.kt @@ -2,6 +2,8 @@ package org.intellij.plugins.markdown.editor.tables.ui import com.intellij.codeInsight.daemon.impl.InlayHintsPassFactory +import com.intellij.openapi.application.ReadAction +import com.intellij.openapi.application.readAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.event.EditorFactoryEvent import com.intellij.openapi.editor.event.EditorFactoryListener @@ -17,7 +19,7 @@ import org.intellij.plugins.markdown.lang.MarkdownFileType internal class MarkdownInlayUpdateOnSoftWrapListener: EditorFactoryListener { override fun editorCreated(event: EditorFactoryEvent) { val editor = event.editor - if (isMarkdownEditor(editor)) { + if (ReadAction.compute { isMarkdownEditor(editor) }) { val softWrapModel = (editor.softWrapModel as? SoftWrapModelEx) ?: return softWrapModel.addSoftWrapChangeListener(object : SoftWrapChangeListener { override fun softWrapsChanged() { diff --git a/spellchecker/src/com/intellij/spellchecker/ui/SpellCheckingEditorCustomization.java b/spellchecker/src/com/intellij/spellchecker/ui/SpellCheckingEditorCustomization.java index 230a33ec60b0..283746fcd35e 100644 --- a/spellchecker/src/com/intellij/spellchecker/ui/SpellCheckingEditorCustomization.java +++ b/spellchecker/src/com/intellij/spellchecker/ui/SpellCheckingEditorCustomization.java @@ -9,6 +9,8 @@ import com.intellij.codeInspection.LocalInspectionTool; import com.intellij.codeInspection.ex.InspectionProfileImpl; import com.intellij.codeInspection.ex.InspectionProfileWrapper; import com.intellij.codeInspection.ex.LocalInspectionToolWrapper; +import com.intellij.execution.dashboard.actions.RunAction; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; @@ -71,7 +73,7 @@ public class SpellCheckingEditorCustomization extends SimpleEditorCustomization return; } - PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()); + PsiFile file = ReadAction.compute(() -> PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument())); if (file == null) { return; } diff --git a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlTagNameSynchronizer.java b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlTagNameSynchronizer.java index 05e197f3be39..1942e24469aa 100644 --- a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlTagNameSynchronizer.java +++ b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlTagNameSynchronizer.java @@ -14,6 +14,7 @@ import com.intellij.lang.xhtml.XHTMLLanguage; import com.intellij.lang.xml.XMLLanguage; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.command.CommandEvent; import com.intellij.openapi.command.CommandListener; import com.intellij.openapi.command.undo.UndoManager; @@ -124,7 +125,7 @@ public final class XmlTagNameSynchronizer implements EditorFactoryListener { public static class MyEditorFactoryListener implements EditorFactoryListener { @Override public void editorCreated(@NotNull EditorFactoryEvent event) { - createSynchronizerFor(event.getEditor()); + ReadAction.compute(() -> { createSynchronizerFor(event.getEditor()); return null; }); } }