don't instantiate LineSet on document freeze appcode/163.5038
authorpeter <peter@jetbrains.com>
Thu, 22 Sep 2016 19:03:18 +0000 (21:03 +0200)
committerpeter <peter@jetbrains.com>
Thu, 22 Sep 2016 19:10:46 +0000 (21:10 +0200)
platform/core-impl/src/com/intellij/openapi/editor/impl/DocumentImpl.java
platform/core-impl/src/com/intellij/openapi/editor/impl/FrozenDocument.java

index 7fa3e8d3f52a479db0ffbc57580fa763bd458745..deaf4c9f2f7a217d42f674145634a0eee1f7d7c3 100644 (file)
@@ -1146,7 +1146,7 @@ public class DocumentImpl extends UserDataHolderBase implements DocumentEx {
       synchronized (myLineSetLock) {
         frozen = myFrozen;
         if (frozen == null) {
-          frozen = new FrozenDocument(myText, getLineSet(), myModificationStamp, SoftReference.dereference(myTextString));
+          frozen = new FrozenDocument(myText, myLineSet, myModificationStamp, SoftReference.dereference(myTextString));
         }
       }
     }
index d0afcec67ac6912d40f192e03936f4a7b6a2e0e9..6b40b2a8bd37379f983abe33b814a6937cf5eb60 100644 (file)
@@ -41,22 +41,31 @@ import java.util.List;
  */
 public class FrozenDocument implements DocumentEx {
   private final ImmutableCharSequence myText;
-  private final LineSet myLineSet;
+  @Nullable private volatile LineSet myLineSet;
   private final long myStamp;
   private volatile SoftReference<String> myTextString;
 
-  FrozenDocument(@NotNull ImmutableCharSequence text, @NotNull LineSet lineSet, long stamp, @Nullable String textString) {
+  FrozenDocument(@NotNull ImmutableCharSequence text, @Nullable LineSet lineSet, long stamp, @Nullable String textString) {
     myText = text;
     myLineSet = lineSet;
     myStamp = stamp;
     myTextString = textString == null ? null : new SoftReference<String>(textString);
   }
 
+  @NotNull
+  private LineSet getLineSet() {
+    LineSet lineSet = myLineSet;
+    if (lineSet == null) {
+      myLineSet = lineSet = LineSet.createLineSet(myText);
+    }
+    return lineSet;
+  }
+
   public FrozenDocument applyEvent(DocumentEvent event, int newStamp) {
     final int offset = event.getOffset();
     final int oldEnd = offset + event.getOldLength();
     ImmutableCharSequence newText = myText.delete(offset, oldEnd).insert(offset, event.getNewFragment());
-    LineSet newLineSet = myLineSet.update(myText, offset, oldEnd, event.getNewFragment(), event.isWholeTextReplaced());
+    LineSet newLineSet = getLineSet().update(myText, offset, oldEnd, event.getNewFragment(), event.isWholeTextReplaced());
     return new FrozenDocument(newText, newLineSet, newStamp, null);
   }
 
@@ -68,7 +77,7 @@ public class FrozenDocument implements DocumentEx {
   @NotNull
   @Override
   public LineIterator createLineIterator() {
-    return myLineSet.createIterator();
+    return getLineSet().createIterator();
   }
 
   @Override
@@ -203,24 +212,24 @@ public class FrozenDocument implements DocumentEx {
 
   @Override
   public int getLineCount() {
-    return myLineSet.getLineCount();
+    return getLineSet().getLineCount();
   }
 
   @Override
   public int getLineNumber(int offset) {
-    return myLineSet.findLineIndex(offset);
+    return getLineSet().findLineIndex(offset);
   }
 
   @Override
   public int getLineStartOffset(int line) {
     if (line == 0) return 0; // otherwise it crashed for zero-length document
-    return myLineSet.getLineStart(line);
+    return getLineSet().getLineStart(line);
   }
 
   @Override
   public int getLineEndOffset(int line) {
     if (getTextLength() == 0 && line == 0) return 0;
-    int result = myLineSet.getLineEnd(line) - getLineSeparatorLength(line);
+    int result = getLineSet().getLineEnd(line) - getLineSeparatorLength(line);
     assert result >= 0;
     return result;
   }
@@ -348,7 +357,7 @@ public class FrozenDocument implements DocumentEx {
 
   @Override
   public int getLineSeparatorLength(int line) {
-    return myLineSet.getSeparatorLength(line);
+    return getLineSet().getSeparatorLength(line);
   }
 
   @Nullable