From df770489bf41e756e747f84f69d21308cda3e1e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20C=C3=A9bron?= Date: Fri, 2 Aug 2013 17:08:08 +0200 Subject: [PATCH] DevKit: resolving for modules fixed --- .../src/dom/impl/IdeaPluginConverter.java | 67 +++++++++++-------- .../codeInsight/DependsCompletion.xml | 6 ++ .../PluginXmlFunctionalTest.groovy | 23 +++++++ 3 files changed, 68 insertions(+), 28 deletions(-) create mode 100644 plugins/devkit/testData/codeInsight/DependsCompletion.xml diff --git a/plugins/devkit/src/dom/impl/IdeaPluginConverter.java b/plugins/devkit/src/dom/impl/IdeaPluginConverter.java index bc7e1f89ab51..94c6d839ef90 100644 --- a/plugins/devkit/src/dom/impl/IdeaPluginConverter.java +++ b/plugins/devkit/src/dom/impl/IdeaPluginConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2013 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,8 +17,10 @@ package org.jetbrains.idea.devkit.dom.impl; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Condition; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScopesCore; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xml.ConvertContext; @@ -26,7 +28,6 @@ import com.intellij.util.xml.DomFileElement; import com.intellij.util.xml.DomService; import com.intellij.util.xml.ResolvingConverter; import gnu.trove.THashSet; -import gnu.trove.TObjectHashingStrategy; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -44,27 +45,24 @@ import java.util.Set; */ public class IdeaPluginConverter extends ResolvingConverter { + private static final Condition NON_CORE_PLUGINS = new Condition() { + @Override + public boolean value(IdeaPlugin plugin) { + return !"com.intellij".equals(plugin.getPluginId()); + } + }; + @NotNull public Collection getVariants(final ConvertContext context) { - Collection plugins = getAllPlugins(context.getProject()); - return new THashSet(plugins, new TObjectHashingStrategy() { - @Override - public int computeHashCode(IdeaPlugin object) { - return StringUtil.notNullize(object.getPluginId()).hashCode(); - } - - @Override - public boolean equals(IdeaPlugin o1, IdeaPlugin o2) { - return StringUtil.notNullize(o1.getPluginId()).equals(o2.getPluginId()); - } - }); + Collection plugins = getAllPluginsWithoutSelf(context); + return ContainerUtil.filter(plugins, NON_CORE_PLUGINS); } @NotNull @Override public Set getAdditionalVariants(@NotNull final ConvertContext context) { final THashSet result = new THashSet(); - for (IdeaPlugin ideaPlugin : getVariants(context)) { + for (IdeaPlugin ideaPlugin : getAllPluginsWithoutSelf(context)) { for (PluginModule module : ideaPlugin.getModules()) { ContainerUtil.addIfNotNull(module.getValue().getValue(), result); } @@ -77,19 +75,8 @@ public class IdeaPluginConverter extends ResolvingConverter { return DevKitBundle.message("error.cannot.resolve.plugin", s); } - 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); - return ContainerUtil.map(files, new Function, IdeaPlugin>() { - public IdeaPlugin fun(DomFileElement ideaPluginDomFileElement) { - return ideaPluginDomFileElement.getRootElement(); - } - }); - } - public IdeaPlugin fromString(@Nullable @NonNls final String s, final ConvertContext context) { - for (IdeaPlugin ideaPlugin : getVariants(context)) { + for (IdeaPlugin ideaPlugin : getAllPluginsWithoutSelf(context)) { final String otherId = ideaPlugin.getPluginId(); if (otherId == null) continue; if (otherId.equals(s)) return ideaPlugin; @@ -104,4 +91,28 @@ public class IdeaPluginConverter extends ResolvingConverter { public String toString(@Nullable final IdeaPlugin ideaPlugin, final ConvertContext context) { return ideaPlugin != null ? ideaPlugin.getPluginId() : null; } + + private static Collection getAllPluginsWithoutSelf(final ConvertContext context) { + final IdeaPlugin self = context.getInvocationElement().getParentOfType(IdeaPlugin.class, true); + if (self == null) return Collections.emptyList(); + + final Collection plugins = getAllPlugins(context.getProject()); + return ContainerUtil.filter(plugins, new Condition() { + @Override + public boolean value(IdeaPlugin plugin) { + return !Comparing.strEqual(self.getPluginId(), plugin.getPluginId()); + } + }); + } + + public static Collection getAllPlugins(final Project project) { + if (DumbService.isDumb(project)) return Collections.emptyList(); + GlobalSearchScope scope = GlobalSearchScopesCore.projectProductionScope(project); + List> files = DomService.getInstance().getFileElements(IdeaPlugin.class, project, scope); + return ContainerUtil.map(files, new Function, IdeaPlugin>() { + public IdeaPlugin fun(DomFileElement ideaPluginDomFileElement) { + return ideaPluginDomFileElement.getRootElement(); + } + }); + } } diff --git a/plugins/devkit/testData/codeInsight/DependsCompletion.xml b/plugins/devkit/testData/codeInsight/DependsCompletion.xml new file mode 100644 index 000000000000..c6d09be89abf --- /dev/null +++ b/plugins/devkit/testData/codeInsight/DependsCompletion.xml @@ -0,0 +1,6 @@ + + com.intellij.myPlugin + + + + \ No newline at end of file diff --git a/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.groovy b/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.groovy index 07df3077a4a7..52c78570200c 100644 --- a/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.groovy +++ b/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.groovy @@ -31,6 +31,7 @@ import com.intellij.usageView.UsageViewNodeTextLocation import com.intellij.usageView.UsageViewTypeLocation import com.intellij.util.xml.DeprecatedClassUsageInspection import org.jetbrains.idea.devkit.inspections.* + /** * @author peter */ @@ -89,6 +90,28 @@ public class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase { myFixture.checkHighlighting(false, false, false); } + public void testDependsCompletion() throws Throwable { + addPluginXml("platform", "\n" + + " com.intellij\n" + + " \n" + + ""); + addPluginXml("lang", "\n" + + " com.intellij\n" + + " \n" + + " \n" + + ""); + addPluginXml("custom", "\n" + + " com.intellij.custom\n" + + ""); + configureByFile(); + + myFixture.completeBasic() + assertSameElements(myFixture.lookupElementStrings, + 'com.intellij.modules.vcs', + 'com.intellij.modules.lang', 'com.intellij.modules.lang.another', + 'com.intellij.custom') + } + private void configureByFile() { myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject(getTestName(false) + ".xml", "META-INF/plugin.xml")); }