From 9ddc1fda18be1503d8604e8d034f16301d076d3b Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Fri, 7 Jul 2017 11:21:08 +0300 Subject: [PATCH] EA-89894 - Throwable: ExceptionUtil.currentStackTrace Fixes situation when soft wraps are recalculated while document listeners are notified, but after listeners in soft wrap model and editor size manager have been processed (exception stack trace shows it happened due to available width changed for editor, but it's hard to say what the exact root cause is) --- .../openapi/editor/impl/view/EditorSizeManager.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorSizeManager.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorSizeManager.java index cf5ffb7f48e5..beca10e6a0c0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorSizeManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorSizeManager.java @@ -71,7 +71,8 @@ class EditorSizeManager extends InlayModel.SimpleAdapter implements PrioritizedD private int myFoldingChangeEndOffset = Integer.MIN_VALUE; private int myVirtualPageHeight; - + + private boolean myDuringDocumentUpdate; private boolean myDirty; // true if we cannot calculate preferred size now because soft wrap model was invalidated after editor // became hidden. myLineWidths contents is irrelevant in such a state. Previously calculated preferred size // is kept until soft wraps will be recalculated and size calculations will become possible @@ -107,6 +108,7 @@ class EditorSizeManager extends InlayModel.SimpleAdapter implements PrioritizedD @Override public void beforeDocumentChange(DocumentEvent event) { + myDuringDocumentUpdate = true; if (myDocument.isInBulkUpdate()) return; myDocumentChangeStartOffset = event.getOffset(); myDocumentChangeEndOffset = event.getOffset() + event.getNewLength(); @@ -114,6 +116,7 @@ class EditorSizeManager extends InlayModel.SimpleAdapter implements PrioritizedD @Override public void documentChanged(DocumentEvent event) { + myDuringDocumentUpdate = false; if (myDocument.isInBulkUpdate()) return; doInvalidateRange(myDocumentChangeStartOffset, myDocumentChangeEndOffset); assertValidState(); @@ -146,7 +149,7 @@ class EditorSizeManager extends InlayModel.SimpleAdapter implements PrioritizedD @Override public void onUpdated(@NotNull Inlay inlay) { - if (myDocument.isInEventsHandling() || myDocument.isInBulkUpdate()) return; + if (myDuringDocumentUpdate || myDocument.isInBulkUpdate()) return; doInvalidateRange(inlay.getOffset(), inlay.getOffset()); } @@ -158,7 +161,7 @@ class EditorSizeManager extends InlayModel.SimpleAdapter implements PrioritizedD myFoldingChangeEndOffset = Math.max(myFoldingChangeEndOffset, event.getActualEndOffset()); invalidate = false; } - if (myDocument.isInEventsHandling()) { + if (myDuringDocumentUpdate) { myDocumentChangeStartOffset = Math.min(myDocumentChangeStartOffset, event.getStartOffset()); myDocumentChangeEndOffset = Math.max(myDocumentChangeEndOffset, event.getActualEndOffset()); invalidate = false; @@ -336,7 +339,7 @@ class EditorSizeManager extends InlayModel.SimpleAdapter implements PrioritizedD void invalidateRange(int startOffset, int endOffset) { if (myDocument.isInBulkUpdate()) return; - if (myDocument.isInEventsHandling()) { + if (myDuringDocumentUpdate) { myDocumentChangeStartOffset = Math.min(myDocumentChangeStartOffset, startOffset); myDocumentChangeEndOffset = Math.max(myDocumentChangeEndOffset, endOffset); }