clear cached values on plugin load/unload

GitOrigin-RevId: aebf935b0ff04c87e10a326d56651aac73b3c9ab
This commit is contained in:
Dennis Ushakov
2019-11-25 10:08:24 +00:00
committed by intellij-monorepo-bot
parent 98792cbf73
commit 0e63e9b69f
3 changed files with 33 additions and 2 deletions
@@ -173,4 +173,8 @@ class CachedValueStabilityChecker {
return "kotlin.jvm.internal.Lambda".equals(superclass.getName());
}
static void cleanupFieldCache() {
ourFieldCache.clear();
}
}
@@ -8,13 +8,22 @@ import com.intellij.openapi.util.UserDataHolder;
import com.intellij.openapi.util.UserDataHolderEx;
import com.intellij.psi.util.*;
import com.intellij.serviceContainer.NonInjectable;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;
/**
* @author ven
*/
public final class CachedValuesManagerImpl extends CachedValuesManager {
private static final Object NULL = new Object();
private ConcurrentMap<UserDataHolder, Object> myCacheHolders = ContainerUtil.createConcurrentWeakMap(ContainerUtil.identityStrategy());
private Set<Key<?>> myKeys = ContainerUtil.newConcurrentSet();
private final Project myProject;
private final CachedValuesFactory myFactory;
@@ -64,8 +73,11 @@ public final class CachedValuesManagerImpl extends CachedValuesManager {
return value.getValue();
}
private static <T> CachedValue<T> saveInUserData(@NotNull UserDataHolder dataHolder,
@NotNull Key<CachedValue<T>> key, CachedValue<T> value) {
private <T> CachedValue<T> saveInUserData(@NotNull UserDataHolder dataHolder,
@NotNull Key<CachedValue<T>> key, CachedValue<T> value) {
myCacheHolders.put(dataHolder, NULL);
myKeys.add(key);
if (dataHolder instanceof UserDataHolderEx) {
return ((UserDataHolderEx)dataHolder).putUserDataIfAbsent(key, value);
}
@@ -88,4 +100,15 @@ public final class CachedValuesManagerImpl extends CachedValuesManager {
return value;
}
@ApiStatus.Internal
public void clearCachedValues() {
for (UserDataHolder holder : myCacheHolders.keySet()) {
for (Key<?> key : myKeys) {
holder.putUserData(key, null);
}
}
CachedValueStabilityChecker.cleanupFieldCache();
myCacheHolders = ContainerUtil.createConcurrentWeakMap(ContainerUtil.identityStrategy());
myKeys = ContainerUtil.newConcurrentSet();
}
}
@@ -71,6 +71,8 @@ import com.intellij.profile.ProfileChangeAdapter;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.PsiModificationTrackerImpl;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.util.CachedValuesManagerImpl;
import com.intellij.util.KeyedLazyInstance;
import com.intellij.util.messages.MessageBus;
import com.intellij.util.messages.MessageBusConnection;
@@ -364,12 +366,14 @@ public final class DaemonListeners implements Disposable {
connection.subscribe(DynamicPluginListener.TOPIC, new DynamicPluginListener() {
@Override
public void pluginLoaded(@NotNull IdeaPluginDescriptor pluginDescriptor) {
((CachedValuesManagerImpl)CachedValuesManager.getManager(myProject)).clearCachedValues();
((PsiModificationTrackerImpl)PsiManager.getInstance(myProject).getModificationTracker()).incCounter();
stopDaemonAndRestartAllFiles("Plugin installed");
}
@Override
public void beforePluginUnload(@NotNull IdeaPluginDescriptor pluginDescriptor, boolean isUpdate) {
((CachedValuesManagerImpl)CachedValuesManager.getManager(myProject)).clearCachedValues();
((PsiModificationTrackerImpl)PsiManager.getInstance(myProject).getModificationTracker()).incCounter();
stopDaemonAndRestartAllFiles("Plugin will be uninstalled");
removeQuickFixesContributedByPlugin(pluginDescriptor);