diff --git a/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java b/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java index 87a402df3f67..2ff1e388c903 100644 --- a/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java +++ b/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java @@ -15,12 +15,15 @@ */ package com.jetbrains.python.psi.resolve; +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.util.containers.ConcurrentHashMap; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -28,28 +31,37 @@ import java.util.Map; * @author yole */ public abstract class PythonPathCache { - private final Map> myCache = new ConcurrentHashMap>(); - private final Map> myQNameCache = new ConcurrentHashMap>(); + private final Map> myCache = ContainerUtil.newConcurrentMap(); + private final Map> myQNameCache = ContainerUtil.newConcurrentMap(); public void clearCache() { myCache.clear(); myQNameCache.clear(); } + @Nullable public List get(QualifiedName qualifiedName) { - return myCache.get(qualifiedName); + final List result = myCache.get(qualifiedName); + if (result == null) { + return null; + } + final boolean staleElementRemoved = result.removeIf(e -> !e.isValid()); + if (staleElementRemoved) { + Logger.getInstance(PythonPathCache.class).warn("Removing invalid element from cache"); + } + return (!result.isEmpty() ? result : null); } public void put(QualifiedName qualifiedName, List results) { - myCache.put(qualifiedName, results); + myCache.put(qualifiedName, new ArrayList<>(results)); } public List getNames(VirtualFile vFile) { return myQNameCache.get(vFile); } - + public void putNames(VirtualFile vFile, List qNames) { - myQNameCache.put(vFile, qNames); + myQNameCache.put(vFile, new ArrayList<>(qNames)); } protected class MyVirtualFileAdapter extends VirtualFileAdapter {