diff --git a/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/dep1.xml b/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/dep1.xml
new file mode 100644
index 000000000000..affe2a025c85
--- /dev/null
+++ b/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/dep1.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/dep2.xml b/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/dep2.xml
new file mode 100644
index 000000000000..affe2a025c85
--- /dev/null
+++ b/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/dep2.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/plugin.xml b/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/plugin.xml
new file mode 100644
index 000000000000..3176257f630b
--- /dev/null
+++ b/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/plugin.xml
@@ -0,0 +1,5 @@
+
+ main
+ dep2
+ dep1
+
\ No newline at end of file
diff --git a/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java b/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java
index 46febadc7cb6..1d3e9b1708ae 100644
--- a/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java
+++ b/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java
@@ -227,7 +227,7 @@ public class IdeaPluginDescriptorImpl implements IdeaPluginDescriptor {
Set dependentPlugins = new LinkedHashSet<>();
Set nonOptionalDependentPlugins = new LinkedHashSet<>();
if (pluginBean.dependencies != null) {
- myOptionalConfigs = new THashMap<>();
+ myOptionalConfigs = new LinkedHashMap<>();
for (PluginDependency dependency : pluginBean.dependencies) {
String text = dependency.pluginId;
if (!StringUtil.isEmptyOrSpaces(text)) {
diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java
index 49d1d8ee83c6..f38aab1efe95 100644
--- a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java
+++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java
@@ -917,7 +917,7 @@ public class PluginManagerCore {
@NotNull Function super String, ? extends IdeaPluginDescriptorImpl> optionalDescriptorLoader) {
Map> optionalConfigs = descriptor.getOptionalConfigs();
if (optionalConfigs != null && !optionalConfigs.isEmpty()) {
- Map> descriptors = new THashMap<>(optionalConfigs.size());
+ Map> descriptors = new LinkedHashMap<>(optionalConfigs.size());
for (Map.Entry> entry : optionalConfigs.entrySet()) {
for (String optionalDescriptorName : entry.getValue()) {
diff --git a/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginDescriptorTest.java b/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginDescriptorTest.java
index 79edbaeee9ca..5b1f49d62c2d 100644
--- a/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginDescriptorTest.java
+++ b/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginDescriptorTest.java
@@ -2,6 +2,7 @@
package com.intellij.ide.plugins;
import com.intellij.openapi.application.ex.PathManagerEx;
+import com.intellij.openapi.extensions.PluginId;
import com.intellij.util.lang.UrlClassLoader;
import org.junit.Test;
@@ -11,6 +12,7 @@ import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.NoSuchElementException;
+import java.util.Set;
import static com.intellij.testFramework.UsefulTestCase.assertEmpty;
import static com.intellij.testFramework.UsefulTestCase.assertOneElement;
@@ -39,6 +41,17 @@ public class PluginDescriptorTest {
assertEquals(1, descriptor.getOptionalDescriptors().size());
}
+ @Test
+ public void testMultipleOptionalDescriptors() {
+ IdeaPluginDescriptorImpl descriptor = loadDescriptor("multipleOptionalDescriptors");
+ assertNotNull(descriptor);
+ Set ids = descriptor.getOptionalDescriptors().keySet();
+ assertEquals(2, ids.size());
+ PluginId[] idsArray = ids.toArray(PluginId.EMPTY_ARRAY);
+ assertEquals("dep2", idsArray[0].getIdString());
+ assertEquals("dep1", idsArray[1].getIdString());
+ }
+
@Test
public void testMalformedDescriptor() {
assertNull(loadDescriptor("malformed"));