mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
DevKit: <depends> resolving for modules fixed
This commit is contained in:
@@ -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"));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user