make Caret.getOffset() work correctly from a side thread (under read action)
authorDmitry Batrak <Dmitry.Batrak@jetbrains.com>
Mon, 24 Oct 2016 14:29:07 +0000 (17:29 +0300)
committerDmitry Batrak <Dmitry.Batrak@jetbrains.com>
Mon, 24 Oct 2016 14:29:58 +0000 (17:29 +0300)
caret/selection marker disposal will be handled by RangeMarkerTree when no references to them will be left

platform/editor-ui-api/src/com/intellij/openapi/editor/Caret.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java

index 87d7ed1c38996664c69c85fd07cb42aedfc18e18..8e85f25ca51a34c5c2a8612e8c7762a76783a350 100644 (file)
@@ -121,9 +121,11 @@ public interface Caret extends UserDataHolderEx, Disposable {
   VisualPosition getVisualPosition();
 
   /**
-   * Returns the offset of the caret in the document.
+   * Returns the offset of the caret in the document. Returns 0 for a disposed (invalid) caret.
    *
    * @return the caret offset.
+   *
+   * @see #isValid()
    */
   int getOffset();
 
index 23b6a3c16638b96daf5803a92c742e8f93f1f9a0..fb201c5041372187a9591ac0c481a1ee0dd2a83a 100644 (file)
@@ -521,9 +521,7 @@ public class CaretImpl extends UserDataHolderBase implements Caret, Dumpable {
 
   private void updateOffsetsFromLogicalPosition() {
     int offset = myEditor.logicalPositionToOffset(myLogicalCaret);
-    PositionMarker oldMarker = myPositionMarker;
     myPositionMarker = new PositionMarker(offset);
-    oldMarker.dispose();
     myLeansTowardsLargerOffsets = myLogicalCaret.leansForward;
     myVirtualSpaceOffset = myLogicalCaret.column - myEditor.offsetToLogicalPosition(offset).column;
   }
@@ -660,12 +658,9 @@ public class CaretImpl extends UserDataHolderBase implements Caret, Dumpable {
   @Override
   public void dispose() {
     if (myPositionMarker != null) {
-      PositionMarker marker = myPositionMarker;
       myPositionMarker = null;
-      marker.dispose();
     }
     if (mySelectionMarker != null) {
-      mySelectionMarker.dispose();
       mySelectionMarker = null;
     }
     isValid = false;
@@ -1162,12 +1157,7 @@ public class CaretImpl extends UserDataHolderBase implements Caret, Dumpable {
         oldSelectionStart = oldSelectionEnd = getOffset();
       }
 
-      SelectionMarker marker = mySelectionMarker;
-      if (marker != null) {
-        marker.dispose();
-      }
-
-      marker = new SelectionMarker(startOffset, endOffset);
+      SelectionMarker marker = new SelectionMarker(startOffset, endOffset);
       if (visualPositionAware) {
         if (endPosition.after(startPosition)) {
           setRangeMarkerStartPosition(startPosition);
@@ -1224,7 +1214,6 @@ public class CaretImpl extends UserDataHolderBase implements Caret, Dumpable {
       if (marker != null && marker.isValid()) {
         int startOffset = marker.getStartOffset();
         int endOffset = marker.getEndOffset();
-        marker.dispose();
         mySelectionMarker = null;
         myEditor.getSelectionModel().fireSelectionChanged(startOffset, endOffset, caretOffset, caretOffset);
       }