diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java b/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java index 8b0eff5e3a2b..f36c69424f4e 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java @@ -2,6 +2,8 @@ package com.intellij.util.xml.impl; import com.intellij.ide.highlighter.DomSupportEnabled; +import com.intellij.ide.plugins.DynamicPluginListener; +import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileTypes.FileTypeRegistry; @@ -60,7 +62,7 @@ import java.util.*; /** * @author peter */ -public final class DomManagerImpl extends DomManager { +public final class DomManagerImpl extends DomManager implements Disposable { private static final Key MOCK = Key.create("MockElement"); static final Key>> CACHED_FILE_ELEMENT = Key.create("CACHED_FILE_ELEMENT"); @@ -105,7 +107,7 @@ public final class DomManagerImpl extends DomManager { public boolean isAspectChangeInteresting(@NotNull PomModelAspect aspect) { return aspect instanceof TreeAspect; } - }, project); + }, this); VirtualFileManager.getInstance().addAsyncFileListener(new AsyncFileListener() { @Nullable @@ -134,9 +136,19 @@ public final class DomManagerImpl extends DomManager { } return event instanceof VFileMoveEvent || event instanceof VFileDeleteEvent; } - }, myProject); + }, this); + + project.getMessageBus().connect(this).subscribe(DynamicPluginListener.TOPIC, new DynamicPluginListener() { + @Override + public void beforePluginUnload(@NotNull IdeaPluginDescriptor pluginDescriptor, boolean isUpdate) { + DomUtil.clearCaches(); + } + }); } + @Override + public void dispose() { } + public long getPsiModificationCount() { return PsiManager.getInstance(getProject()).getModificationTracker().getModificationCount(); } diff --git a/xml/dom-openapi/src/com/intellij/util/xml/DomUtil.java b/xml/dom-openapi/src/com/intellij/util/xml/DomUtil.java index c99431c5510f..fa500fdb5c2e 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/DomUtil.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/DomUtil.java @@ -21,6 +21,7 @@ import com.intellij.util.containers.ConcurrentFactoryMap; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xml.reflect.*; import com.intellij.xml.util.XmlTagUtil; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -147,6 +148,12 @@ public class DomUtil { return aClass == DUMMY ? null : aClass; } + @ApiStatus.Internal + public static void clearCaches() { + ourTypeParameters.clear(); + ourVariableSubstitutions.clear(); + } + @Nullable public static XmlElement getValueElement(GenericDomValue domValue) { if (domValue instanceof GenericAttributeValue) {