mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
clear cached values on plugin load/unload
GitOrigin-RevId: aebf935b0ff04c87e10a326d56651aac73b3c9ab
This commit is contained in:
committed by
intellij-monorepo-bot
parent
98792cbf73
commit
0e63e9b69f
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user