From 086e1ea5b53a8d140f04ff8523ef12be7f06845d Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 30 Aug 2012 15:14:02 +0200 Subject: [PATCH] a more economical way of traversing plugin dependencies (IDEA-90706) --- .../src/dom/impl/ExtensionDomExtender.java | 60 ++++++++++++------- .../src/dom/impl/ExtensionNsConverter.java | 2 +- .../src/dom/impl/IdeaPluginConverter.java | 7 +-- 3 files changed, 41 insertions(+), 28 deletions(-) diff --git a/plugins/devkit/src/dom/impl/ExtensionDomExtender.java b/plugins/devkit/src/dom/impl/ExtensionDomExtender.java index dc220c4cd0ba..e93e2b30e64c 100644 --- a/plugins/devkit/src/dom/impl/ExtensionDomExtender.java +++ b/plugins/devkit/src/dom/impl/ExtensionDomExtender.java @@ -28,6 +28,8 @@ import com.intellij.psi.xml.XmlTag; import com.intellij.refactoring.psi.PropertyUtils; import com.intellij.util.containers.CollectionFactory; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.LinkedMultiMap; +import com.intellij.util.containers.MultiMap; import com.intellij.util.xml.*; import com.intellij.util.xml.reflect.DomExtender; import com.intellij.util.xml.reflect.DomExtension; @@ -80,34 +82,48 @@ public class ExtensionDomExtender extends DomExtender { if (ideaPlugin == null) return; - String prefix = extensions.getDefaultExtensionNs().getStringValue(); - if (prefix == null) prefix = extensions.getXmlns().getStringValue(); - if (prefix != null) { - prefix += "."; - } else { - prefix = ""; + String prefix = getEpPrefix(extensions); + for (IdeaPlugin plugin : getVisiblePlugins(ideaPlugin)) { + final String pluginId = StringUtil.notNullize(plugin.getPluginId(), "com.intellij"); + for (ExtensionPoints points : plugin.getExtensionPoints()) { + for (ExtensionPoint point : points.getExtensionPoints()) { + registerExtensionPoint(registrar, point, prefix, pluginId); + } + } } - - registerExtensions(prefix, ideaPlugin, registrar, CollectionFactory.hashSet()); } - private static void registerExtensions(final String prefix, final IdeaPlugin ideaPlugin, final DomExtensionsRegistrar registrar, Set visited) { - if (!visited.add(ideaPlugin)) { + private static String getEpPrefix(Extensions extensions) { + String prefix = extensions.getDefaultExtensionNs().getStringValue(); + if (prefix == null) prefix = extensions.getXmlns().getStringValue(); + return prefix != null ? prefix + "." : ""; + } + + private static Set getVisiblePlugins(IdeaPlugin ideaPlugin) { + Set result = CollectionFactory.hashSet(); + MultiMap byId = getPluginMap(ideaPlugin.getManager().getProject()); + collectDependencies(ideaPlugin, result, byId); + //noinspection NullableProblems + result.addAll(byId.get(null)); + return result; + } + + private static MultiMap getPluginMap(final Project project) { + MultiMap byId = new LinkedMultiMap(); + for (IdeaPlugin each : IdeaPluginConverter.getAllPlugins(project)) { + byId.putValue(each.getPluginId(), each); + } + return byId; + } + + private static void collectDependencies(final IdeaPlugin ideaPlugin, Set result, final MultiMap byId) { + if (!result.add(ideaPlugin)) { return; } - final String pluginId = StringUtil.notNullize(ideaPlugin.getPluginId(), "com.intellij"); - for (ExtensionPoints points : ideaPlugin.getExtensionPoints()) { - for (ExtensionPoint point : points.getExtensionPoints()) { - registerExtensionPoint(registrar, point, prefix, pluginId); - } - } - final Collection dependencies = getDependencies(ideaPlugin); - for (IdeaPlugin anotherPlugin : IdeaPluginConverter.collectAllVisiblePlugins(DomUtil.getFile(ideaPlugin))) { - final String value = anotherPlugin.getPluginId(); - // value == null for "included" platform plugins like DomPlugin.xml, XmlPlugin.xml, etc. - if (value == null || dependencies.contains(value)) { - registerExtensions(prefix, anotherPlugin, registrar, visited); + for (String id : getDependencies(ideaPlugin)) { + for (IdeaPlugin dep : byId.get(id)) { + collectDependencies(dep, result, byId); } } } diff --git a/plugins/devkit/src/dom/impl/ExtensionNsConverter.java b/plugins/devkit/src/dom/impl/ExtensionNsConverter.java index 18e7a3200f38..60a5af99474f 100644 --- a/plugins/devkit/src/dom/impl/ExtensionNsConverter.java +++ b/plugins/devkit/src/dom/impl/ExtensionNsConverter.java @@ -42,7 +42,7 @@ public class ExtensionNsConverter extends ResolvingConverter { final Collection dependencies = ExtensionDomExtender.getDependencies(ideaPlugin); final List depPlugins = new ArrayList(); - for (IdeaPlugin plugin : IdeaPluginConverter.collectAllVisiblePlugins(context.getFile())) { + for (IdeaPlugin plugin : IdeaPluginConverter.getAllPlugins(context.getProject())) { final String value = plugin.getPluginId(); if (value != null && dependencies.contains(value)) { depPlugins.add(plugin); diff --git a/plugins/devkit/src/dom/impl/IdeaPluginConverter.java b/plugins/devkit/src/dom/impl/IdeaPluginConverter.java index dec6fb5fa867..bc7e1f89ab51 100644 --- a/plugins/devkit/src/dom/impl/IdeaPluginConverter.java +++ b/plugins/devkit/src/dom/impl/IdeaPluginConverter.java @@ -19,7 +19,6 @@ import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.xml.XmlFile; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xml.ConvertContext; @@ -47,7 +46,7 @@ public class IdeaPluginConverter extends ResolvingConverter { @NotNull public Collection getVariants(final ConvertContext context) { - Collection plugins = collectAllVisiblePlugins(context.getFile()); + Collection plugins = getAllPlugins(context.getProject()); return new THashSet(plugins, new TObjectHashingStrategy() { @Override public int computeHashCode(IdeaPlugin object) { @@ -78,9 +77,7 @@ public class IdeaPluginConverter extends ResolvingConverter { return DevKitBundle.message("error.cannot.resolve.plugin", s); } - public static Collection collectAllVisiblePlugins(@NotNull XmlFile xmlFile) { - - Project project = xmlFile.getProject(); + public static Collection getAllPlugins(final Project project) { if (DumbService.isDumb(project)) return Collections.emptyList(); GlobalSearchScope scope = GlobalSearchScope.allScope(project); List> files = DomService.getInstance().getFileElements(IdeaPlugin.class, project, scope);