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 14b54ec96dcd..ca6d3000a874 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java @@ -197,7 +197,7 @@ public class ExtensionPointImpl implements ExtensionPoint { } } } - return result; + return result.length == 0 ? result : result.clone(); } @Override diff --git a/platform/extensions/testSrc/com/intellij/openapi/extensions/impl/ExtensionPointImplTest.java b/platform/extensions/testSrc/com/intellij/openapi/extensions/impl/ExtensionPointImplTest.java index f9065c061786..6db6a2f9da07 100644 --- a/platform/extensions/testSrc/com/intellij/openapi/extensions/impl/ExtensionPointImplTest.java +++ b/platform/extensions/testSrc/com/intellij/openapi/extensions/impl/ExtensionPointImplTest.java @@ -24,6 +24,7 @@ import org.junit.After; import org.junit.Test; import org.picocontainer.defaults.DefaultPicoContainer; +import java.util.Arrays; import java.util.List; import static org.hamcrest.Matchers.*; @@ -248,6 +249,20 @@ public class ExtensionPointImplTest { assertThat(ourTestLog.errors(), empty()); } + @Test + public void clientsCannotModifyCachedExtensions() { + ExtensionPoint extensionPoint = buildExtensionPoint(Integer.class); + extensionPoint.registerExtension(4); + extensionPoint.registerExtension(2); + + Integer[] extensions = extensionPoint.getExtensions(); + assertEquals(ContainerUtil.newArrayList(4, 2), Arrays.asList(extensions)); + Arrays.sort(extensions); + assertEquals(ContainerUtil.newArrayList(2, 4), Arrays.asList(extensions)); + + assertEquals(ContainerUtil.newArrayList(4, 2), Arrays.asList(extensionPoint.getExtensions())); + } + private static ExtensionPoint buildExtensionPoint(Class aClass) { return new ExtensionPointImpl( ExtensionsImplTest.EXTENSION_POINT_NAME_1, aClass.getName(), ExtensionPoint.Kind.INTERFACE,