diff --git a/extensions/source/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java b/extensions/source/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java index 1345c3df4c09..eecffb9c28d5 100644 --- a/extensions/source/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java +++ b/extensions/source/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java @@ -276,6 +276,18 @@ public class ExtensionPointImpl implements ExtensionPoint { myExtensionAdapters.add(adapter); } + public boolean unregisterComponentAdapter(final ExtensionComponentAdapter componentAdapter) { + if (myExtensionAdapters.contains(componentAdapter)) { + myExtensionAdapters.remove(componentAdapter); + return true; + } + else if (myLoadedAdapters.contains(componentAdapter)) { + unregisterExtension(componentAdapter.getExtension()); + return true; + } + return false; + } + private static class ObjectComponentAdapter extends ExtensionComponentAdapter { private Object myExtension; private LoadingOrder myLoadingOrder; diff --git a/extensions/source/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java b/extensions/source/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java index cbe14856031d..a2b066f340ab 100644 --- a/extensions/source/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java +++ b/extensions/source/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java @@ -189,8 +189,7 @@ public class ExtensionsAreaImpl implements ExtensionsArea { } ExtensionComponentAdapter adapter = (ExtensionComponentAdapter) myExtensionElement2extension.remove(extensionElement); if (adapter == null) return; - if (getExtensionPoint(epName).hasExtension(adapter.getExtension())) { - getExtensionPoint(epName).unregisterExtension(adapter.getExtension()); + if (getExtensionPointImpl(epName).unregisterComponentAdapter(adapter)) { MutablePicoContainer pluginContainer = internalGetPluginContainer(pluginName); pluginContainer.unregisterComponent(adapter.getComponentKey()); if (pluginContainer.getComponentAdapters().size() == 0) { diff --git a/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionsAreaTest.java b/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionsAreaTest.java index b26284190ad3..f9ed86dcec2c 100644 --- a/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionsAreaTest.java +++ b/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionsAreaTest.java @@ -1,13 +1,13 @@ package com.intellij.openapi.extensions.impl; +import com.intellij.openapi.extensions.Extensions; import junit.framework.TestCase; -import org.picocontainer.defaults.DefaultPicoContainer; import org.picocontainer.MutablePicoContainer; +import org.picocontainer.defaults.DefaultPicoContainer; +import org.jdom.Element; import java.util.List; -import com.intellij.openapi.extensions.Extensions; - /** * @author mike */ @@ -28,4 +28,22 @@ public class ExtensionsAreaTest extends TestCase { final List adapters = myPicoContainer.getComponentAdaptersOfType(ExtensionsAreaTest.class); assertEquals(1, adapters.size()); } + + public void testNoCreateOnUnregisterElement() { + myExtensionsArea.registerExtensionPoint("test.ep", TestClass.class.getName()); + final Element element = ExtensionComponentAdapterTest.readElement(""); + TestClass.ourCreationCount = 0; + myExtensionsArea.registerExtension("test", element); + assertEquals(0, TestClass.ourCreationCount); + myExtensionsArea.unregisterExtension("test", element); + assertEquals(0, TestClass.ourCreationCount); + } + + public static class TestClass { + public static int ourCreationCount = 0; + + public TestClass() { + ourCreationCount++; + } + } }