From 8540bac84ff29a196e35e5501aea67f14a55c61d Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 4 Jun 2014 18:23:34 +0200 Subject: [PATCH] RefCountHolder: allow referenced files' ast to be gc-ed during highlighting --- .../codeInsight/daemon/impl/RefCountHolder.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/RefCountHolder.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/RefCountHolder.java index 80fa57375663..018fce54ddba 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/RefCountHolder.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/RefCountHolder.java @@ -28,6 +28,7 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.util.ArrayUtilRt; import com.intellij.util.containers.BidirectionalMap; import com.intellij.util.containers.ConcurrentHashMap; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -42,8 +43,8 @@ public class RefCountHolder { private final PsiFile myFile; private final BidirectionalMap myLocalRefsMap = new BidirectionalMap(); - private final Map myDclsUsedMap = new ConcurrentHashMap(); - private final Map myImportStatements = new ConcurrentHashMap(); + private final Map myDclsUsedMap = ContainerUtil.newConcurrentMap(); + private final Map myImportStatements = ContainerUtil.newConcurrentMap(); private final AtomicReference myState = new AtomicReference(VIRGIN); private static final ProgressIndicator VIRGIN = new DaemonProgressIndicator(); // just created or cleared private static final ProgressIndicator READY = new DaemonProgressIndicator(); @@ -130,7 +131,7 @@ public class RefCountHolder { } public void registerLocallyReferenced(@NotNull PsiNamedElement result) { - myDclsUsedMap.put(result,Boolean.TRUE); + myDclsUsedMap.put(PsiAnchor.create(result), Boolean.TRUE); } public void registerReference(@NotNull PsiJavaReference ref, @NotNull JavaResolveResult resolveResult) { @@ -185,10 +186,10 @@ public class RefCountHolder { removeInvalidFrom(myDclsUsedMap.keySet()); } - private static void removeInvalidFrom(@NotNull Collection collection) { - for (Iterator it = collection.iterator(); it.hasNext();) { - PsiElement element = it.next(); - if (!element.isValid()) it.remove(); + private static void removeInvalidFrom(@NotNull Collection collection) { + for (Iterator it = collection.iterator(); it.hasNext();) { + PsiAnchor element = it.next(); + if (element.retrieve() == null) it.remove(); } } @@ -199,7 +200,7 @@ public class RefCountHolder { } if (array != null && !array.isEmpty() && !isParameterUsedRecursively(element, array)) return true; - Boolean usedStatus = myDclsUsedMap.get(element); + Boolean usedStatus = myDclsUsedMap.get(PsiAnchor.create(element)); return usedStatus == Boolean.TRUE; }