diff --git a/platform/extensions/src/com/intellij/openapi/extensions/impl/BeanExtensionPoint.java b/platform/extensions/src/com/intellij/openapi/extensions/impl/BeanExtensionPoint.java index ea6466ae84c6..8f50f0956b42 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/impl/BeanExtensionPoint.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/impl/BeanExtensionPoint.java @@ -48,7 +48,7 @@ public final class BeanExtensionPoint extends ExtensionPointImpl { } @Override - public void unregisterExtensions(@NotNull List elements, List listenerCallbacks) { + public void unregisterExtensions(@NotNull PluginDescriptor pluginDescriptor, @NotNull List elements, List listenerCallbacks) { Map defaultAttributes = new HashMap<>(); ClassLoader classLoader = myDescriptor.getPluginClassLoader(); if (classLoader == null) { @@ -67,7 +67,7 @@ public final class BeanExtensionPoint extends ExtensionPointImpl { return true; } XmlExtensionAdapter xmlExtensionAdapter = (XmlExtensionAdapter)adapter; - return !xmlExtensionAdapter.isLoadedFromAnyElement(elements, defaultAttributes); + return xmlExtensionAdapter.getPluginDescriptor() != pluginDescriptor || !xmlExtensionAdapter.isLoadedFromAnyElement(elements, defaultAttributes); }, false, listenerCallbacks); } } \ No newline at end of file diff --git a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java index 1842c4f09f62..3871f3db694d 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java @@ -638,7 +638,7 @@ public abstract class ExtensionPointImpl<@NotNull T> implements ExtensionPoint elements, List listenerCallbacks); + public abstract void unregisterExtensions(@NotNull PluginDescriptor pluginDescriptor, @NotNull List elements, List listenerCallbacks); private void notifyListeners(@NotNull ExtensionEvent event, @NotNull T extensionObject, diff --git a/platform/extensions/src/com/intellij/openapi/extensions/impl/InterfaceExtensionPoint.java b/platform/extensions/src/com/intellij/openapi/extensions/impl/InterfaceExtensionPoint.java index 540b9e61c41c..f94de95c1d20 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/impl/InterfaceExtensionPoint.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/impl/InterfaceExtensionPoint.java @@ -51,7 +51,7 @@ public final class InterfaceExtensionPoint extends ExtensionPointImpl { } @Override - public void unregisterExtensions(@NotNull List elements, List listenerCallbacks) { + public void unregisterExtensions(@NotNull PluginDescriptor pluginDescriptor, @NotNull List elements, List listenerCallbacks) { Set implementationClassNames = new HashSet<>(); for (Element element : elements) { implementationClassNames.add(element.getAttributeValue("implementation")); diff --git a/platform/extensions/src/com/intellij/openapi/extensions/impl/XmlExtensionAdapter.java b/platform/extensions/src/com/intellij/openapi/extensions/impl/XmlExtensionAdapter.java index 34d49285b48e..86e93fb5437c 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/impl/XmlExtensionAdapter.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/impl/XmlExtensionAdapter.java @@ -84,6 +84,10 @@ class XmlExtensionAdapter extends ExtensionComponentAdapter { boolean isLoadedFromAnyElement(List candidateElements, Map defaultAttributes) { SkipDefaultValuesSerializationFilters filter = new SkipDefaultValuesSerializationFilters(); + if (myExtensionElement == null && extensionInstance == null) { + // dummy extension with no data; unload based on PluginDescriptor check in calling method + return true; + } Element serializedElement = myExtensionElement != null ? myExtensionElement : XmlSerializer.serialize(extensionInstance, filter); Map serializedAttributes = getExtensionAttributesMap(serializedElement); diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPlugins.kt b/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPlugins.kt index 5f437511802c..49d7e97924ef 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPlugins.kt +++ b/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPlugins.kt @@ -309,7 +309,7 @@ object DynamicPlugins { application.runWriteAction { try { processOptionalDependenciesOnPlugin(pluginDescriptor) { loadedDescriptorOfDependency, dependencyDescriptor -> - unloadPluginDescriptor(dependencyDescriptor, dependencyDescriptor) + unloadPluginDescriptor(dependencyDescriptor, loadedDescriptorOfDependency, dependencyDescriptor) if (loadedPluginDescriptor.pluginClassLoader is PluginClassLoader) { (loadedDescriptorOfDependency.pluginClassLoader as? PluginClassLoader)?.detachParent(loadedPluginDescriptor.pluginClassLoader) } @@ -397,7 +397,11 @@ object DynamicPlugins { GROUP.createNotification(text, notificationType).notify(null) } - private fun unloadPluginDescriptor(pluginDescriptor: IdeaPluginDescriptorImpl, loadedPluginDescriptor: IdeaPluginDescriptorImpl) { + private fun unloadPluginDescriptor( + pluginDescriptor: IdeaPluginDescriptorImpl, + loadedPluginDescriptor: IdeaPluginDescriptorImpl, + descriptorToUnloadListeners: IdeaPluginDescriptorImpl = loadedPluginDescriptor + ) { val application = ApplicationManager.getApplication() as ApplicationImpl (ActionManager.getInstance() as ActionManagerImpl).unloadActions(pluginDescriptor) @@ -408,12 +412,12 @@ object DynamicPlugins { for ((epName, epExtensions) in extensions) { val appEp = Extensions.getRootArea().getExtensionPointIfRegistered(epName) as ExtensionPointImpl<*>? if (appEp != null) { - appEp.unregisterExtensions(epExtensions, unloadListeners) + appEp.unregisterExtensions(loadedPluginDescriptor, epExtensions, unloadListeners) } else { for (openProject in openProjects) { val projectEp = openProject.extensionArea.getExtensionPointIfRegistered(epName) as ExtensionPointImpl<*>? - projectEp?.unregisterExtensions(epExtensions, unloadListeners) + projectEp?.unregisterExtensions(loadedPluginDescriptor, epExtensions, unloadListeners) } } } @@ -437,7 +441,7 @@ object DynamicPlugins { for (appServiceInstance in appServiceInstances) { application.stateStore.unloadComponent(appServiceInstance) } - (application.messageBus as MessageBusImpl).unsubscribePluginListeners(loadedPluginDescriptor) + (application.messageBus as MessageBusImpl).unsubscribePluginListeners(descriptorToUnloadListeners) for (project in openProjects) { val projectServiceInstances = (project as ProjectImpl).unloadServices(pluginDescriptor.project) @@ -451,7 +455,7 @@ object DynamicPlugins { module.stateStore.unloadComponent(moduleServiceInstance) } } - (project.messageBus as MessageBusImpl).unsubscribePluginListeners(loadedPluginDescriptor) + (project.messageBus as MessageBusImpl).unsubscribePluginListeners(descriptorToUnloadListeners) } }