From 1fc1ada8a22875ce1afa633bd5c83bb98e1e84f0 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Wed, 30 Dec 2009 15:47:23 +0300 Subject: [PATCH] plugin.xml support: using DomFileIndex --- .../devkit/src/dom/impl/ExtensionDomExtender.java | 4 +- .../devkit/src/dom/impl/IdeaPluginConverter.java | 272 +++++++-------------- .../testData/codeInsight/extensionPoints.xml | 3 + .../testData/codeInsight/pluginWithXInclude.xml | 16 ++ .../codeInsight/PluginXmlFunctionalTest.java | 8 + 5 files changed, 122 insertions(+), 181 deletions(-) rewrite plugins/devkit/src/dom/impl/IdeaPluginConverter.java (60%) create mode 100644 plugins/devkit/testData/codeInsight/extensionPoints.xml create mode 100644 plugins/devkit/testData/codeInsight/pluginWithXInclude.xml diff --git a/plugins/devkit/src/dom/impl/ExtensionDomExtender.java b/plugins/devkit/src/dom/impl/ExtensionDomExtender.java index 926d215699..071e6450b4 100644 --- a/plugins/devkit/src/dom/impl/ExtensionDomExtender.java +++ b/plugins/devkit/src/dom/impl/ExtensionDomExtender.java @@ -60,9 +60,9 @@ public class ExtensionDomExtender extends DomExtender { } else { prefix = ""; } - + + registerExtensions(prefix, ideaPlugin, registrar, psiManager); final Collection dependencies = getDependencies(ideaPlugin); - ContainerUtil.addIfNotNull(ideaPlugin.getPluginId(), dependencies); for (IdeaPlugin plugin : IdeaPluginConverter.collectAllVisiblePlugins(DomUtil.getFile(extensions))) { final String value = plugin.getPluginId(); if (value != null && dependencies.contains(value)) { diff --git a/plugins/devkit/src/dom/impl/IdeaPluginConverter.java b/plugins/devkit/src/dom/impl/IdeaPluginConverter.java dissimilarity index 60% index b875522040..0aead2ac5b 100644 --- a/plugins/devkit/src/dom/impl/IdeaPluginConverter.java +++ b/plugins/devkit/src/dom/impl/IdeaPluginConverter.java @@ -1,179 +1,93 @@ -/* - * Copyright 2000-2009 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.idea.devkit.dom.impl; - -import com.intellij.openapi.fileTypes.FileTypes; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleUtil; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.roots.ModuleRootManager; -import com.intellij.openapi.roots.PackageIndex; -import com.intellij.openapi.vfs.JarFileSystem; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiManager; -import com.intellij.psi.xml.XmlDocument; -import com.intellij.psi.xml.XmlFile; -import com.intellij.util.xml.ConvertContext; -import com.intellij.util.xml.DomElement; -import com.intellij.util.xml.DomManager; -import com.intellij.util.xml.ResolvingConverter; -import com.intellij.util.containers.CollectionFactory; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.devkit.DevKitBundle; -import org.jetbrains.idea.devkit.dom.IdeaPlugin; -import org.jetbrains.idea.devkit.module.PluginModuleType; -import org.jetbrains.idea.devkit.projectRoots.IdeaJdk; - -import java.util.*; - -/** - * @author mike - */ -public class IdeaPluginConverter extends ResolvingConverter { - @NonNls private static final Set PLATFORM_MODULES = CollectionFactory.newTroveSet("com.intellij.modules.platform", - "com.intellij.modules.lang", - "com.intellij.modules.vcs", - "com.intellij.modules.xdebugger", - "com.intellij.modules.xml"); - - @NotNull - public Collection getVariants(final ConvertContext context) { - return collectAllVisiblePlugins(context.getFile()); - } - - @NotNull - @Override - public Set getAdditionalVariants(@NotNull final ConvertContext context) { - return PLATFORM_MODULES; - } - - @Override - public String getErrorMessage(@Nullable final String s, final ConvertContext context) { - return DevKitBundle.message("error.cannot.resolve.plugin", s); - } - - public static Collection collectAllVisiblePlugins(final XmlFile xmlFile) { - List ideaPlugins = new ArrayList(); - final Project project = xmlFile.getProject(); - final PsiManager psiManager = PsiManager.getInstance(project); - - final Iterable metaInfs = PackageIndex.getInstance(project).getDirsByPackageName("META-INF", true); - - for (VirtualFile metaInf : metaInfs) { - final VirtualFile pluginXml = metaInf.findChild("plugin.xml"); - if (pluginXml == null) continue; - final IdeaPlugin ideaPlugin = getIdeaPlugin(project, psiManager, pluginXml); - if (ideaPlugin != null) { - ideaPlugins.add(ideaPlugin); - } - } - - final Module module = ModuleUtil.findModuleForPsiElement(xmlFile); - if (module != null) { - // a plugin.xml doesn't need to be in a source folder. - final Module[] dependencies = ModuleRootManager.getInstance(module).getDependencies(); - for (Module dep : dependencies) { - if (PluginModuleType.isOfType(dep)) { - final XmlFile file = PluginModuleType.getPluginXml(dep); - if (file == null) continue; - final VirtualFile pluginXml = file.getVirtualFile(); - if (pluginXml != null) { - final IdeaPlugin ideaPlugin = getIdeaPlugin(project, psiManager, pluginXml); - if (ideaPlugin != null) { - if (!ideaPlugins.contains(ideaPlugin)) { - ideaPlugins.add(ideaPlugin); - } - } - } - } - } - - final Sdk jdk = ModuleRootManager.getInstance(module).getSdk(); - if (jdk != null && jdk.getSdkType() instanceof IdeaJdk) { - final VirtualFile jdkHome = jdk.getHomeDirectory(); - if (jdkHome != null) { - final VirtualFile pluginsHome = jdkHome.findChild("plugins"); - final VirtualFile[] plugins = pluginsHome != null ? pluginsHome.getChildren() : VirtualFile.EMPTY_ARRAY; - for (VirtualFile plugin : plugins) { - if (plugin.isDirectory()) { - final VirtualFile lib = plugin.findChild("lib"); - final VirtualFile[] children = lib != null ? lib.getChildren() : VirtualFile.EMPTY_ARRAY; - for (VirtualFile child : children) { - final IdeaPlugin ideaPlugin = findPluginInFile(child, project, psiManager); - if (ideaPlugin != null) { - ideaPlugins.add(ideaPlugin); - } - } - } - else { - final IdeaPlugin ideaPlugin = findPluginInFile(plugin, project, psiManager); - if (ideaPlugin != null) { - ideaPlugins.add(ideaPlugin); - } - } - } - } - } - } - - return ideaPlugins; - } - - @Nullable - private static IdeaPlugin findPluginInFile(final VirtualFile child, final Project project, final PsiManager psiManager) { - if (child.getFileType() != FileTypes.ARCHIVE) return null; - - final VirtualFile jarRoot = JarFileSystem.getInstance().getJarRootForLocalFile(child); - if (jarRoot == null) return null; - final VirtualFile metaInf = jarRoot.findChild("META-INF"); - if (metaInf == null) return null; - - final VirtualFile pluginXml = metaInf.findChild("plugin.xml"); - if (pluginXml == null) return null; - - return getIdeaPlugin(project, psiManager, pluginXml); - } - - @Nullable - private static IdeaPlugin getIdeaPlugin(final Project project, final PsiManager psiManager, final VirtualFile pluginXml) { - final XmlFile psiFile = (XmlFile)psiManager.findFile(pluginXml); - if (psiFile == null) return null; - - final XmlDocument document = psiFile.getDocument(); - if (document == null) return null; - - final DomElement domElement = DomManager.getDomManager(project).getDomElement(document.getRootTag()); - if (!(domElement instanceof IdeaPlugin)) return null; - return (IdeaPlugin)domElement; - - } - - public IdeaPlugin fromString(@Nullable @NonNls final String s, final ConvertContext context) { - for (IdeaPlugin ideaPlugin : getVariants(context)) { - final String otherId = ideaPlugin.getPluginId(); - if (otherId == null) continue; - if (otherId.equals(s)) return ideaPlugin; - } - return null; - } - - public String toString(@Nullable final IdeaPlugin ideaPlugin, final ConvertContext context) { - return ideaPlugin != null ? ideaPlugin.getPluginId() : null; - } -} +/* + * Copyright 2000-2009 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.devkit.dom.impl; + +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleUtil; +import com.intellij.openapi.project.Project; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.Function; +import com.intellij.util.containers.CollectionFactory; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.xml.ConvertContext; +import com.intellij.util.xml.DomFileElement; +import com.intellij.util.xml.DomService; +import com.intellij.util.xml.ResolvingConverter; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.devkit.DevKitBundle; +import org.jetbrains.idea.devkit.dom.IdeaPlugin; + +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * @author mike + */ +public class IdeaPluginConverter extends ResolvingConverter { + @NonNls private static final Set PLATFORM_MODULES = CollectionFactory.newTroveSet("com.intellij.modules.platform", + "com.intellij.modules.lang", + "com.intellij.modules.vcs", + "com.intellij.modules.xdebugger", + "com.intellij.modules.xml"); + + @NotNull + public Collection getVariants(final ConvertContext context) { + return collectAllVisiblePlugins(context.getFile()); + } + + @NotNull + @Override + public Set getAdditionalVariants(@NotNull final ConvertContext context) { + return PLATFORM_MODULES; + } + + @Override + public String getErrorMessage(@Nullable final String s, final ConvertContext context) { + return DevKitBundle.message("error.cannot.resolve.plugin", s); + } + + public static Collection collectAllVisiblePlugins(@NotNull XmlFile xmlFile) { + + Project project = xmlFile.getProject(); + Module module = ModuleUtil.findModuleForPsiElement(xmlFile); + + GlobalSearchScope scope = module == null ? GlobalSearchScope.allScope(project) : + GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module, true); + 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)) { + final String otherId = ideaPlugin.getPluginId(); + if (otherId == null) continue; + if (otherId.equals(s)) return ideaPlugin; + } + return null; + } + + public String toString(@Nullable final IdeaPlugin ideaPlugin, final ConvertContext context) { + return ideaPlugin != null ? ideaPlugin.getPluginId() : null; + } +} diff --git a/plugins/devkit/testData/codeInsight/extensionPoints.xml b/plugins/devkit/testData/codeInsight/extensionPoints.xml new file mode 100644 index 0000000000..d568f48dbe --- /dev/null +++ b/plugins/devkit/testData/codeInsight/extensionPoints.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/devkit/testData/codeInsight/pluginWithXInclude.xml b/plugins/devkit/testData/codeInsight/pluginWithXInclude.xml new file mode 100644 index 0000000000..bea4d7ba0a --- /dev/null +++ b/plugins/devkit/testData/codeInsight/pluginWithXInclude.xml @@ -0,0 +1,16 @@ + + + foo + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java b/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java index 28eb918039..b9a3ec0226 100644 --- a/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java +++ b/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java @@ -126,4 +126,12 @@ public class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase { myFixture.testHighlighting("pluginWithModules.xml"); } + public void testPluginWithModules() throws Throwable { + myFixture.testHighlighting("pluginWithModules.xml"); + } + + public void testPluginWithXInclude() throws Throwable { + myFixture.testHighlighting("pluginWithXInclude.xml", "extensionPoints.xml"); + } + } -- 2.11.4.GIT