DevKit: <depends> resolving for modules fixed

This commit is contained in:
Yann Cébron
2013-08-02 17:08:08 +02:00
parent 32cac0b733
commit df770489bf
3 changed files with 68 additions and 28 deletions
@@ -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<IdeaPlugin> {
private static final Condition<IdeaPlugin> NON_CORE_PLUGINS = new Condition<IdeaPlugin>() {
@Override
public boolean value(IdeaPlugin plugin) {
return !"com.intellij".equals(plugin.getPluginId());
}
};
@NotNull
public Collection<? extends IdeaPlugin> getVariants(final ConvertContext context) {
Collection<IdeaPlugin> plugins = getAllPlugins(context.getProject());
return new THashSet<IdeaPlugin>(plugins, new TObjectHashingStrategy<IdeaPlugin>() {
@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<IdeaPlugin> plugins = getAllPluginsWithoutSelf(context);
return ContainerUtil.filter(plugins, NON_CORE_PLUGINS);
}
@NotNull
@Override
public Set<String> getAdditionalVariants(@NotNull final ConvertContext context) {
final THashSet<String> result = new THashSet<String>();
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<IdeaPlugin> {
return DevKitBundle.message("error.cannot.resolve.plugin", s);
}
public static Collection<IdeaPlugin> getAllPlugins(final Project project) {
if (DumbService.isDumb(project)) return Collections.emptyList();
GlobalSearchScope scope = GlobalSearchScope.allScope(project);
List<DomFileElement<IdeaPlugin>> files = DomService.getInstance().getFileElements(IdeaPlugin.class, project, scope);
return ContainerUtil.map(files, new Function<DomFileElement<IdeaPlugin>, IdeaPlugin>() {
public IdeaPlugin fun(DomFileElement<IdeaPlugin> 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<IdeaPlugin> {
public String toString(@Nullable final IdeaPlugin ideaPlugin, final ConvertContext context) {
return ideaPlugin != null ? ideaPlugin.getPluginId() : null;
}
private static Collection<IdeaPlugin> getAllPluginsWithoutSelf(final ConvertContext context) {
final IdeaPlugin self = context.getInvocationElement().getParentOfType(IdeaPlugin.class, true);
if (self == null) return Collections.emptyList();
final Collection<IdeaPlugin> plugins = getAllPlugins(context.getProject());
return ContainerUtil.filter(plugins, new Condition<IdeaPlugin>() {
@Override
public boolean value(IdeaPlugin plugin) {
return !Comparing.strEqual(self.getPluginId(), plugin.getPluginId());
}
});
}
public static Collection<IdeaPlugin> getAllPlugins(final Project project) {
if (DumbService.isDumb(project)) return Collections.emptyList();
GlobalSearchScope scope = GlobalSearchScopesCore.projectProductionScope(project);
List<DomFileElement<IdeaPlugin>> files = DomService.getInstance().getFileElements(IdeaPlugin.class, project, scope);
return ContainerUtil.map(files, new Function<DomFileElement<IdeaPlugin>, IdeaPlugin>() {
public IdeaPlugin fun(DomFileElement<IdeaPlugin> ideaPluginDomFileElement) {
return ideaPluginDomFileElement.getRootElement();
}
});
}
}
@@ -0,0 +1,6 @@
<idea-plugin>
<id>com.intellij.myPlugin</id>
<depends><caret></depends>
</idea-plugin>
@@ -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", "<idea-plugin>\n" +
" <id>com.intellij</id>\n" +
" <module value=\"com.intellij.modules.vcs\"/>\n" +
"</idea-plugin>");
addPluginXml("lang", "<idea-plugin>\n" +
" <id>com.intellij</id>\n" +
" <module value=\"com.intellij.modules.lang\"/>\n" +
" <module value=\"com.intellij.modules.lang.another\"/>\n" +
"</idea-plugin>");
addPluginXml("custom", "<idea-plugin>\n" +
" <id>com.intellij.custom</id>\n" +
"</idea-plugin>");
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"));
}