From 56d9c82c5b512b3638fb43cdcacf9d1432355f42 Mon Sep 17 00:00:00 2001 From: "Ilya.Kazakevich" Date: Wed, 1 Jun 2016 00:15:48 +0300 Subject: [PATCH] Strong references removed from ``PythonPathCache`` since cache should not prevent anything from GC --- .../python/psi/resolve/PythonPathCache.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java b/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java index 2ff1e388c903..c95e23707738 100644 --- a/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java +++ b/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java @@ -19,6 +19,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.vfs.*; import com.intellij.psi.PsiElement; import com.intellij.psi.util.QualifiedName; +import com.intellij.reference.SoftReference; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -26,13 +27,14 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * @author yole */ public abstract class PythonPathCache { - private final Map> myCache = ContainerUtil.newConcurrentMap(); - private final Map> myQNameCache = ContainerUtil.newConcurrentMap(); + private final Map>> myCache = ContainerUtil.newConcurrentMap(); + private final Map> myQNameCache = ContainerUtil.newConcurrentMap(); public void clearCache() { myCache.clear(); @@ -41,10 +43,11 @@ public abstract class PythonPathCache { @Nullable public List get(QualifiedName qualifiedName) { - final List result = myCache.get(qualifiedName); - if (result == null) { + final List> references = myCache.get(qualifiedName); + if (references == null) { return null; } + final List result = references.stream().map(r -> r.get()).filter(p -> p != null).collect(Collectors.toList()); final boolean staleElementRemoved = result.removeIf(e -> !e.isValid()); if (staleElementRemoved) { Logger.getInstance(PythonPathCache.class).warn("Removing invalid element from cache"); @@ -53,15 +56,21 @@ public abstract class PythonPathCache { } public void put(QualifiedName qualifiedName, List results) { - myCache.put(qualifiedName, new ArrayList<>(results)); + if (results != null) { + myCache.put(qualifiedName, new ArrayList<>(results.stream().map(e -> new SoftReference<>(e)).collect(Collectors.toList()))); + } } + @Nullable public List getNames(VirtualFile vFile) { - return myQNameCache.get(vFile); + if (vFile == null) { + return null; + } + return myQNameCache.get(vFile.getUrl()); } public void putNames(VirtualFile vFile, List qNames) { - myQNameCache.put(vFile, new ArrayList<>(qNames)); + myQNameCache.put(vFile.getUrl(), new ArrayList<>(qNames)); } protected class MyVirtualFileAdapter extends VirtualFileAdapter {