platform: load components from optional descriptors in deterministic order (IDEA-203089)

This commit is contained in:
nik
2019-03-13 12:02:11 +03:00
parent 61511b27ed
commit e1c867fe8e
6 changed files with 22 additions and 2 deletions
@@ -0,0 +1,5 @@
<idea-plugin>
<id>main</id>
<depends optional="true" config-file="dep2.xml">dep2</depends>
<depends optional="true" config-file="dep1.xml">dep1</depends>
</idea-plugin>
@@ -227,7 +227,7 @@ public class IdeaPluginDescriptorImpl implements IdeaPluginDescriptor {
Set<PluginId> dependentPlugins = new LinkedHashSet<>();
Set<PluginId> 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)) {
@@ -917,7 +917,7 @@ public class PluginManagerCore {
@NotNull Function<? super String, ? extends IdeaPluginDescriptorImpl> optionalDescriptorLoader) {
Map<PluginId, List<String>> optionalConfigs = descriptor.getOptionalConfigs();
if (optionalConfigs != null && !optionalConfigs.isEmpty()) {
Map<PluginId, List<IdeaPluginDescriptorImpl>> descriptors = new THashMap<>(optionalConfigs.size());
Map<PluginId, List<IdeaPluginDescriptorImpl>> descriptors = new LinkedHashMap<>(optionalConfigs.size());
for (Map.Entry<PluginId, List<String>> entry : optionalConfigs.entrySet()) {
for (String optionalDescriptorName : entry.getValue()) {
@@ -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<PluginId> 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"));