From f693b13d469fb6e7120e7cda60ff4fb0a0abfab5 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Wed, 20 Feb 2019 11:44:14 +0300 Subject: [PATCH] EA-134652 - NPE: CaretImpl.updateOffsetsFromLogicalPosition another solution --- .../openapi/editor/impl/FoldingModelImpl.java | 96 +++++++++---------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java index 7d81af45a306..be12fe5a2d2a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java @@ -367,60 +367,60 @@ public class FoldingModelImpl extends InlayModel.SimpleAdapter myEditor.getGutterComponentEx().repaint(); myEditor.invokeDelayedErrorStripeRepaint(); - for (Caret caret : myEditor.getCaretModel().getAllCarets()) { - if (!caret.isValid()) continue; - // There is a possible case that caret position is already visual position aware. But visual position depends on number of folded - // logical lines as well, hence, we can't be sure that target logical position defines correct visual position because fold - // regions have just changed. Hence, we use 'raw' logical position instead. - LogicalPosition caretPosition = caret.getLogicalPosition(); - int caretOffset = myEditor.logicalPositionToOffset(caretPosition); - int selectionStart = caret.getSelectionStart(); - int selectionEnd = caret.getSelectionEnd(); + myEditor.getCaretModel().runBatchCaretOperation(() -> { + for (Caret caret : myEditor.getCaretModel().getAllCarets()) { + // There is a possible case that caret position is already visual position aware. But visual position depends on number of folded + // logical lines as well, hence, we can't be sure that target logical position defines correct visual position because fold + // regions have just changed. Hence, we use 'raw' logical position instead. + LogicalPosition caretPosition = caret.getLogicalPosition(); + int caretOffset = myEditor.logicalPositionToOffset(caretPosition); + int selectionStart = caret.getSelectionStart(); + int selectionEnd = caret.getSelectionEnd(); - LogicalPosition positionToUse = null; - int offsetToUse = -1; + LogicalPosition positionToUse = null; + int offsetToUse = -1; - FoldRegion collapsed = myFoldTree.fetchOutermost(caretOffset); - SavedCaretPosition savedPosition = caret.getUserData(SAVED_CARET_POSITION); - boolean markedForUpdate = caret.getUserData(MARK_FOR_UPDATE) != null; + FoldRegion collapsed = myFoldTree.fetchOutermost(caretOffset); + SavedCaretPosition savedPosition = caret.getUserData(SAVED_CARET_POSITION); + boolean markedForUpdate = caret.getUserData(MARK_FOR_UPDATE) != null; - if (savedPosition != null && savedPosition.isUpToDate(myEditor)) { - int savedOffset = myEditor.logicalPositionToOffset(savedPosition.position); - FoldRegion collapsedAtSaved = myFoldTree.fetchOutermost(savedOffset); - if (collapsedAtSaved == null) { - positionToUse = savedPosition.position; + if (savedPosition != null && savedPosition.isUpToDate(myEditor)) { + int savedOffset = myEditor.logicalPositionToOffset(savedPosition.position); + FoldRegion collapsedAtSaved = myFoldTree.fetchOutermost(savedOffset); + if (collapsedAtSaved == null) { + positionToUse = savedPosition.position; + } + else { + offsetToUse = collapsedAtSaved.getStartOffset(); + } } - else { - offsetToUse = collapsedAtSaved.getStartOffset(); + + if (collapsed != null && positionToUse == null) { + positionToUse = myEditor.offsetToLogicalPosition(collapsed.getStartOffset()); + } + + if ((markedForUpdate || moveCaretFromCollapsedRegion) && caret.isUpToDate()) { + if (offsetToUse >= 0) { + caret.moveToOffset(offsetToUse); + } + else if (positionToUse != null) { + caret.moveToLogicalPosition(positionToUse); + } + else { + ((CaretImpl)caret).updateVisualPosition(); + } + } + + caret.putUserData(SAVED_CARET_POSITION, savedPosition); + caret.putUserData(MARK_FOR_UPDATE, null); + + if (isOffsetInsideCollapsedRegion(selectionStart) || isOffsetInsideCollapsedRegion(selectionEnd)) { + caret.removeSelection(); + } else if (selectionStart < myEditor.getDocument().getTextLength()) { + caret.setSelection(selectionStart, selectionEnd); } } - - if (collapsed != null && positionToUse == null) { - positionToUse = myEditor.offsetToLogicalPosition(collapsed.getStartOffset()); - } - - if ((markedForUpdate || moveCaretFromCollapsedRegion) && caret.isUpToDate()) { - if (offsetToUse >= 0) { - caret.moveToOffset(offsetToUse); - } - else if (positionToUse != null) { - caret.moveToLogicalPosition(positionToUse); - } - else { - ((CaretImpl)caret).updateVisualPosition(); - } - } - - caret.putUserData(SAVED_CARET_POSITION, savedPosition); - caret.putUserData(MARK_FOR_UPDATE, null); - - if (isOffsetInsideCollapsedRegion(selectionStart) || isOffsetInsideCollapsedRegion(selectionEnd)) { - caret.removeSelection(); - } else if (selectionStart < myEditor.getDocument().getTextLength()) { - caret.setSelection(selectionStart, selectionEnd); - } - } - + }); if (mySavedCaretShift > 0) { final ScrollingModel scrollingModel = myEditor.getScrollingModel(); scrollingModel.disableAnimation();