From 88e2960b440103d40f46c6cc2e8d3de3c686d7d3 Mon Sep 17 00:00:00 2001 From: "Vassiliy.Kudryashov" Date: Tue, 19 Jul 2016 14:43:34 +0300 Subject: [PATCH] IDEA-156735 Bookmarks causing typing slowness --- .../com/intellij/ide/bookmarks/Bookmark.java | 71 ++++++++++++------- 1 file changed, 46 insertions(+), 25 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/bookmarks/Bookmark.java b/platform/lang-impl/src/com/intellij/ide/bookmarks/Bookmark.java index 4836d1265948..6782c8cc545e 100644 --- a/platform/lang-impl/src/com/intellij/ide/bookmarks/Bookmark.java +++ b/platform/lang-impl/src/com/intellij/ide/bookmarks/Bookmark.java @@ -49,17 +49,19 @@ import com.intellij.pom.Navigatable; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; +import com.intellij.reference.SoftReference; import com.intellij.ui.ColorUtil; import com.intellij.ui.JBColor; import com.intellij.ui.RetrievableIcon; -import com.intellij.util.NotNullProducer; import com.intellij.util.PlatformIcons; -import com.intellij.util.Processor; +import com.intellij.util.containers.WeakHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; public class Bookmark implements Navigatable, Comparable { public static final Icon DEFAULT_ICON = new MyCheckedIcon(); @@ -67,6 +69,7 @@ public class Bookmark implements Navigatable, Comparable { private final VirtualFile myFile; @NotNull private OpenFileDescriptor myTarget; private final Project myProject; + private WeakHashMap> myHighlighterRefs; private String myDescription; private char myMnemonic = 0; @@ -106,33 +109,37 @@ public class Bookmark implements Navigatable, Comparable { } public RangeHighlighter createHighlighter(@NotNull MarkupModelEx markup) { - final RangeHighlighterEx myHighlighter; + final RangeHighlighterEx highlighter; int line = getLine(); if (line >= 0) { - myHighlighter = markup.addPersistentLineHighlighter(line, HighlighterLayer.ERROR + 1, null); - if (myHighlighter != null) { - myHighlighter.setGutterIconRenderer(new MyGutterIconRenderer(this)); + highlighter = markup.addPersistentLineHighlighter(line, HighlighterLayer.ERROR + 1, null); + if (highlighter != null) { + highlighter.setGutterIconRenderer(new MyGutterIconRenderer(this)); TextAttributes textAttributes = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(CodeInsightColors.BOOKMARKS_ATTRIBUTES); Color stripeColor = textAttributes.getErrorStripeColor(); - myHighlighter.setErrorStripeMarkColor(stripeColor != null ? stripeColor : Color.black); - myHighlighter.setErrorStripeTooltip(getBookmarkTooltip()); + highlighter.setErrorStripeMarkColor(stripeColor != null ? stripeColor : Color.black); + highlighter.setErrorStripeTooltip(getBookmarkTooltip()); - TextAttributes attributes = myHighlighter.getTextAttributes(); + TextAttributes attributes = highlighter.getTextAttributes(); if (attributes == null) { attributes = new TextAttributes(); } attributes.setBackgroundColor(textAttributes.getBackgroundColor()); attributes.setForegroundColor(textAttributes.getForegroundColor()); - myHighlighter.setTextAttributes(attributes); + highlighter.setTextAttributes(attributes); } } else { - myHighlighter = null; + highlighter = null; } - return myHighlighter; + if (myHighlighterRefs == null) myHighlighterRefs = new WeakHashMap<>(); + if (highlighter != null) { + myHighlighterRefs.put(markup.getDocument(), new WeakReference(highlighter)); + } + return highlighter; } @Nullable @@ -141,24 +148,33 @@ public class Bookmark implements Navigatable, Comparable { } public void release() { - int line = getLine(); - if (line < 0) { - return; - } - final Document document = getDocument(); - if (document == null) return; - MarkupModelEx markup = (MarkupModelEx)DocumentMarkupModel.forDocument(document, myProject, true); - final Document markupDocument = markup.getDocument(); - if (markupDocument.getLineCount() <= line) return; - RangeHighlighterEx highlighter = findMyHighlighter(); - if (highlighter != null) { - highlighter.dispose(); + try { + int line = getLine(); + if (line < 0) { + return; + } + final Document document = getDocument(); + if (document == null) return; + MarkupModelEx markup = (MarkupModelEx)DocumentMarkupModel.forDocument(document, myProject, true); + final Document markupDocument = markup.getDocument(); + if (markupDocument.getLineCount() <= line) return; + RangeHighlighterEx highlighter = findMyHighlighter(); + if (highlighter != null) { + highlighter.dispose(); + } + } finally { + myHighlighterRefs = null; } } private RangeHighlighterEx findMyHighlighter() { final Document document = getDocument(); if (document == null) return null; + Reference reference = myHighlighterRefs != null ? myHighlighterRefs.get(document) : null; + RangeHighlighterEx result = SoftReference.dereference(reference); + if (result != null) { + return result; + } MarkupModelEx markup = (MarkupModelEx)DocumentMarkupModel.forDocument(document, myProject, true); final Document markupDocument = markup.getDocument(); final int startOffset = 0; @@ -173,7 +189,12 @@ public class Bookmark implements Navigatable, Comparable { } return true; }); - return found.get(); + result = found.get(); + if (result != null) { + if (myHighlighterRefs == null) myHighlighterRefs = new WeakHashMap<>(); + myHighlighterRefs.put(document, new WeakReference(result)); + } + return result; } public Icon getIcon() {