From a13593d445bc1440acdee71d13d434f329191d78 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Fri, 28 Mar 2014 15:44:43 +0400 Subject: [PATCH] use WeakHashMap (Upsource#105) --- .../preview/ImageOrColorPreviewManager.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/preview/ImageOrColorPreviewManager.java b/platform/lang-impl/src/com/intellij/codeInsight/preview/ImageOrColorPreviewManager.java index b4a984bbb6a8..49c8b7164f2e 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/preview/ImageOrColorPreviewManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/preview/ImageOrColorPreviewManager.java @@ -33,9 +33,9 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; -import com.intellij.reference.SoftReference; import com.intellij.util.Alarm; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.WeakHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -44,10 +44,8 @@ import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; -import java.lang.ref.WeakReference; import java.util.Collection; import java.util.Collections; -import java.util.HashSet; import java.util.Set; public class ImageOrColorPreviewManager implements Disposable, EditorMouseMotionListener { @@ -57,8 +55,12 @@ public class ImageOrColorPreviewManager implements Disposable, EditorMouseMotion private final Alarm alarm = new Alarm(); + /** + * this collection should not keep strong references to the elements + * @link getPsiElementsAt() + */ @Nullable - private WeakReference> elementsRef; + private Collection myElements; public ImageOrColorPreviewManager(EditorFactory editorFactory) { // we don't use multicaster because we don't want to serve all editors - only supported @@ -148,7 +150,7 @@ public class ImageOrColorPreviewManager implements Disposable, EditorMouseMotion return Collections.emptySet(); } - final Set elements = new HashSet(); + final Set elements = Collections.newSetFromMap(new WeakHashMap()); final int offset = editor.logicalPositionToOffset(editor.xyToLogicalPosition(point)); ContainerUtil.addIfNotNull(elements, InjectedLanguageUtil.findElementAtNoCommit(psiFile, offset)); for (PsiFile file : psiFile.getViewProvider().getAllFiles()) { @@ -161,7 +163,7 @@ public class ImageOrColorPreviewManager implements Disposable, EditorMouseMotion @Override public void dispose() { alarm.cancelAllRequests(); - elementsRef = null; + myElements = null; } @Override @@ -173,13 +175,13 @@ public class ImageOrColorPreviewManager implements Disposable, EditorMouseMotion alarm.cancelAllRequests(); Point point = event.getMouseEvent().getPoint(); - if (elementsRef == null && event.getMouseEvent().isShiftDown()) { + if (myElements == null && event.getMouseEvent().isShiftDown()) { alarm.addRequest(new PreviewRequest(point, editor, false), 100); } else { - Collection elements = SoftReference.dereference(elementsRef); + Collection elements = myElements; if (!getPsiElementsAt(point, editor).equals(elements)) { - elementsRef = null; + myElements = null; for (ElementPreviewProvider provider : Extensions.getExtensions(ElementPreviewProvider.EP_NAME)) { try { if (elements != null) { @@ -217,7 +219,7 @@ public class ImageOrColorPreviewManager implements Disposable, EditorMouseMotion @Override public void run() { Collection elements = getPsiElementsAt(point, editor); - if (elements.equals(SoftReference.dereference(elementsRef))) return; + if (elements.equals(myElements)) return; for (PsiElement element : elements) { if (element == null || !element.isValid()) { return; @@ -238,7 +240,7 @@ public class ImageOrColorPreviewManager implements Disposable, EditorMouseMotion } } } - elementsRef = new WeakReference>(elements); + myElements = elements; } } } \ No newline at end of file