From 262d6c0e3d30bada643fe07d68614d5c6684f44f Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Tue, 1 Oct 2019 22:37:15 +0300 Subject: [PATCH] IDEA-209769 Transitive optional plugin XML dependency does not work 2 Honor non-optional dependencies too. GitOrigin-RevId: e884d8d5ad33e411e951f3b892ee878763166fba --- .../ide/plugins/PluginManagerCore.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) 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 6054d4dbc2ee..3ddc1aaf55ce 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java +++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java @@ -1165,8 +1165,17 @@ public class PluginManagerCore { return dep != null && dep.isEnabled(); }; for (IdeaPluginDescriptorImpl descriptor : result) { - for (IdeaPluginDescriptorImpl d : optionalDescriptorRecursively(descriptor, enabledCondition)) { - descriptor.mergeOptionalConfig(d); + for (IdeaPluginDescriptorImpl dep : optionalDescriptorRecursively(descriptor, enabledCondition)) { + boolean requiredDepMissing = false; + for (PluginId depId : dep.getDependentPluginIds()) { + if (!enabledCondition.value(depId) && + ArrayUtil.indexOf(dep.getOptionalDependentPluginIds(), depId) == -1) { + requiredDepMissing = true; + break; + } + } + if (requiredDepMissing) continue; + descriptor.mergeOptionalConfig(dep); } } } @@ -1666,15 +1675,15 @@ public class PluginManagerCore { withOptionalDeps ? allDeps .append(optionalDescriptorRecursively(descriptor, Conditions.alwaysTrue()) - .flatten(d -> JBIterable.of(d.getOptionalDependentPluginIds()))) - .unique() + .flatten(d -> JBIterable.of(d.getDependentPluginIds()))) : allDeps .filter(id -> ArrayUtil.indexOf(descriptor.getOptionalDependentPluginIds(), id) == -1); - return selectedDeps.filterMap(id -> { + JBIterable convertedDeps = selectedDeps.filterMap(id -> { IdeaPluginDescriptorImpl plugin = idMap.get(id); if (plugin == descriptor) return null; return plugin != null && convertModulesToPlugins && isModuleDependency(id) ? plugin.getPluginId() : id; }); + return convertedDeps.unique(); }); this.idMap = idMap; }