[devkit] DOM indexes: extract PluginXmlIndexBase

GitOrigin-RevId: 00107fc37420bb07e89b7001108a81ca05db3c5d
This commit is contained in:
Yann Cébron
2019-08-30 15:14:01 +02:00
committed by intellij-monorepo-bot
parent 9c86c8c492
commit 64e399be30
6 changed files with 127 additions and 147 deletions

View File

@@ -1,7 +1,6 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.idea.devkit.dom.index;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
@@ -11,7 +10,8 @@ import com.intellij.psi.PsiManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.indexing.*;
import com.intellij.util.indexing.FileBasedIndex;
import com.intellij.util.indexing.ID;
import com.intellij.util.io.DataExternalizer;
import com.intellij.util.io.EnumeratorIntegerDescriptor;
import com.intellij.util.io.EnumeratorStringDescriptor;
@@ -27,7 +27,7 @@ import org.jetbrains.idea.devkit.dom.IdeaPlugin;
import java.util.*;
public class ExtensionPointIndex extends FileBasedIndexExtension<String, Integer> {
public class ExtensionPointIndex extends PluginXmlIndexBase<String, Integer> {
private static final ID<String, Integer> NAME = ID.create("devkit.ExtensionPointIndex");
@@ -37,27 +37,16 @@ public class ExtensionPointIndex extends FileBasedIndexExtension<String, Integer
return NAME;
}
@NotNull
@Override
public DataIndexer<String, Integer, FileContent> getIndexer() {
return new DataIndexer<String, Integer, FileContent>() {
@NotNull
@Override
public Map<String, Integer> map(@NotNull FileContent inputData) {
IdeaPlugin plugin = RegistrationIndexer.obtainIdeaPlugin(inputData);
if (plugin == null) return Collections.emptyMap();
Map<String, Integer> result = new HashMap<>();
for (DomElement points : getChildrenWithoutIncludes(plugin, "extensionPoints")) {
for (DomElement point : getChildrenWithoutIncludes(points, "extensionPoint")) {
ExtensionPoint extensionPoint = (ExtensionPoint)point;
result.put(extensionPoint.getEffectiveQualifiedName(), extensionPoint.getXmlTag().getTextOffset());
}
}
return result;
protected Map<String, Integer> performIndexing(IdeaPlugin plugin) {
Map<String, Integer> result = new HashMap<>();
for (DomElement points : getChildrenWithoutIncludes(plugin, "extensionPoints")) {
for (DomElement point : getChildrenWithoutIncludes(points, "extensionPoint")) {
ExtensionPoint extensionPoint = (ExtensionPoint)point;
result.put(extensionPoint.getEffectiveQualifiedName(), extensionPoint.getXmlTag().getTextOffset());
}
};
}
return result;
}
// skip any xi:include
@@ -86,17 +75,6 @@ public class ExtensionPointIndex extends FileBasedIndexExtension<String, Integer
return 0;
}
@NotNull
@Override
public FileBasedIndex.InputFilter getInputFilter() {
return new DefaultFileTypeSpecificInputFilter(StdFileTypes.XML);
}
@Override
public boolean dependsOnFileContent() {
return true;
}
public static Map<String, ExtensionPoint> getExtensionPoints(Project project, Set<VirtualFile> files, String epPrefix) {
Map<String, ExtensionPoint> result = new HashMap<>();

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2000-2017 JetBrains s.r.o.
* Copyright 2000-2019 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.
@@ -21,12 +21,15 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.indexing.*;
import com.intellij.util.indexing.DefaultFileTypeSpecificInputFilter;
import com.intellij.util.indexing.FileBasedIndex;
import com.intellij.util.indexing.ID;
import com.intellij.util.io.DataExternalizer;
import com.intellij.util.io.DataInputOutputUtil;
import com.intellij.util.io.EnumeratorStringDescriptor;
import com.intellij.util.io.KeyDescriptor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.devkit.dom.IdeaPlugin;
import org.jetbrains.idea.devkit.dom.index.RegistrationEntry.RegistrationType;
import java.io.DataInput;
@@ -35,7 +38,7 @@ import java.io.IOException;
import java.util.List;
import java.util.Map;
public class IdeaPluginRegistrationIndex extends FileBasedIndexExtension<String, List<RegistrationEntry>> {
public class IdeaPluginRegistrationIndex extends PluginXmlIndexBase<String, List<RegistrationEntry>> {
private static final int INDEX_VERSION = 1;
@@ -67,16 +70,9 @@ public class IdeaPluginRegistrationIndex extends FileBasedIndexExtension<String,
return NAME;
}
@NotNull
@Override
public DataIndexer<String, List<RegistrationEntry>, FileContent> getIndexer() {
return new DataIndexer<String, List<RegistrationEntry>, FileContent>() {
@NotNull
@Override
public Map<String, List<RegistrationEntry>> map(@NotNull FileContent inputData) {
return new RegistrationIndexer(inputData).indexFile();
}
};
protected Map<String, List<RegistrationEntry>> performIndexing(IdeaPlugin plugin) {
return new RegistrationIndexer(plugin).indexFile();
}
@NotNull
@@ -107,11 +103,6 @@ public class IdeaPluginRegistrationIndex extends FileBasedIndexExtension<String,
};
}
@Override
public boolean dependsOnFileContent() {
return true;
}
public static boolean isRegisteredApplicationComponent(PsiClass psiClass, GlobalSearchScope scope) {
return isRegistered(psiClass, scope, RegistrationType.APPLICATION_COMPONENT);
}

View File

@@ -1,7 +1,6 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.idea.devkit.dom.index;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
@@ -10,21 +9,21 @@ import com.intellij.util.PathUtil;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.SmartHashSet;
import com.intellij.util.indexing.*;
import com.intellij.util.indexing.FileBasedIndex;
import com.intellij.util.indexing.ID;
import com.intellij.util.io.DataExternalizer;
import com.intellij.util.io.EnumeratorStringDescriptor;
import com.intellij.util.io.KeyDescriptor;
import com.intellij.util.io.VoidDataExternalizer;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.devkit.dom.Dependency;
import org.jetbrains.idea.devkit.dom.IdeaPlugin;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.*;
public class PluginIdDependenciesIndex extends ScalarIndexExtension<String> {
public class PluginIdDependenciesIndex extends PluginXmlIndexBase<String, Void> {
private static final ID<String, Void> NAME = ID.create("PluginIdDependenciesIndex");
@@ -48,29 +47,29 @@ public class PluginIdDependenciesIndex extends ScalarIndexExtension<String> {
@NotNull
@Override
public DataIndexer<String, Void, FileContent> getIndexer() {
return inputData -> {
IdeaPlugin plugin = RegistrationIndexer.obtainIdeaPlugin(inputData);
if (plugin == null) return Collections.emptyMap();
public DataExternalizer<Void> getValueExternalizer() {
return VoidDataExternalizer.INSTANCE;
}
List<String> ids = new SmartList<>();
final String pluginId = plugin.getPluginId();
if (pluginId != null) {
ids.add(PLUGIN_ID_KEY_PREFIX + pluginId);
@Override
protected Map<String, Void> performIndexing(IdeaPlugin plugin) {
List<String> ids = new SmartList<>();
final String pluginId = plugin.getPluginId();
if (pluginId != null) {
ids.add(PLUGIN_ID_KEY_PREFIX + pluginId);
}
for (Dependency dependency : plugin.getDependencies()) {
ContainerUtil.addIfNotNull(ids, dependency.getStringValue());
final String configFile = dependency.getConfigFile().getStringValue();
if (configFile != null) {
final String filename = PathUtil.getFileName(configFile);
ids.add(getDependsIndexingKey(filename));
}
}
for (Dependency dependency : plugin.getDependencies()) {
ContainerUtil.addIfNotNull(ids, dependency.getStringValue());
final String configFile = dependency.getConfigFile().getStringValue();
if (configFile != null) {
final String filename = PathUtil.getFileName(configFile);
ids.add(getDependsIndexingKey(filename));
}
}
return ContainerUtil.newHashMap(ids, Collections.nCopies(ids.size(), null));
};
return ContainerUtil.newHashMap(ids, Collections.nCopies(ids.size(), null));
}
@Override
@@ -78,17 +77,6 @@ public class PluginIdDependenciesIndex extends ScalarIndexExtension<String> {
return 1;
}
@NotNull
@Override
public FileBasedIndex.InputFilter getInputFilter() {
return new DefaultFileTypeSpecificInputFilter(StdFileTypes.XML);
}
@Override
public boolean dependsOnFileContent() {
return true;
}
public static Set<String> getPluginAndDependsIds(Project project, Set<VirtualFile> files) {
Set<String> ids = new SmartHashSet<>();
for (VirtualFile file : files) {

View File

@@ -1,7 +1,6 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.idea.devkit.dom.index;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.impl.LibraryScopeCache;
import com.intellij.openapi.util.Condition;
@@ -13,21 +12,21 @@ import com.intellij.psi.search.GlobalSearchScopesCore;
import com.intellij.psi.xml.XmlFile;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.JBIterable;
import com.intellij.util.indexing.*;
import com.intellij.util.indexing.FileBasedIndex;
import com.intellij.util.indexing.ID;
import com.intellij.util.io.DataExternalizer;
import com.intellij.util.io.EnumeratorStringDescriptor;
import com.intellij.util.io.KeyDescriptor;
import com.intellij.util.io.VoidDataExternalizer;
import com.intellij.util.xml.DomElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.devkit.dom.IdeaPlugin;
import org.jetbrains.idea.devkit.dom.PluginModule;
import org.jetbrains.idea.devkit.util.DescriptorUtil;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.*;
public class PluginIdModuleIndex extends ScalarIndexExtension<String> {
public class PluginIdModuleIndex extends PluginXmlIndexBase<String, Void> {
private static final ID<String, Void> NAME = ID.create("PluginIdModuleIndex");
@NotNull
@@ -38,18 +37,18 @@ public class PluginIdModuleIndex extends ScalarIndexExtension<String> {
@NotNull
@Override
public DataIndexer<String, Void, FileContent> getIndexer() {
return inputData -> {
IdeaPlugin plugin = RegistrationIndexer.obtainIdeaPlugin(inputData);
if (plugin == null) return Collections.emptyMap();
public DataExternalizer<Void> getValueExternalizer() {
return VoidDataExternalizer.INSTANCE;
}
List<String> ids = new ArrayList<>();
ids.add(StringUtil.notNullize(plugin.getPluginId()));
for (PluginModule module : plugin.getModules()) {
ContainerUtil.addIfNotNull(ids, module.getValue().getStringValue());
}
return ContainerUtil.newHashMap(ids, Collections.nCopies(ids.size(), null));
};
@Override
protected Map<String, Void> performIndexing(IdeaPlugin plugin) {
List<String> ids = new ArrayList<>();
ids.add(StringUtil.notNullize(plugin.getPluginId()));
for (PluginModule module : plugin.getModules()) {
ContainerUtil.addIfNotNull(ids, module.getValue().getStringValue());
}
return ContainerUtil.newHashMap(ids, Collections.nCopies(ids.size(), null));
}
@NotNull
@@ -63,17 +62,6 @@ public class PluginIdModuleIndex extends ScalarIndexExtension<String> {
return 1;
}
@NotNull
@Override
public FileBasedIndex.InputFilter getInputFilter() {
return new DefaultFileTypeSpecificInputFilter(StdFileTypes.XML);
}
@Override
public boolean dependsOnFileContent() {
return true;
}
public static Collection<VirtualFile> getFiles(@NotNull Project project, @NotNull String idOrModule) {
GlobalSearchScope scope = GlobalSearchScopesCore.projectProductionScope(project)
.union(LibraryScopeCache.getInstance(project).getLibrariesOnlyScope());

View File

@@ -0,0 +1,59 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.idea.devkit.dom.index;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlFile;
import com.intellij.util.indexing.*;
import com.intellij.util.text.CharArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.devkit.dom.IdeaPlugin;
import org.jetbrains.idea.devkit.util.DescriptorUtil;
import java.util.Collections;
import java.util.Map;
abstract class PluginXmlIndexBase<K, V> extends FileBasedIndexExtension<K, V> {
protected abstract Map<K, V> performIndexing(IdeaPlugin plugin);
@Override
public boolean dependsOnFileContent() {
return true;
}
@NotNull
@Override
public FileBasedIndex.InputFilter getInputFilter() {
return new DefaultFileTypeSpecificInputFilter(StdFileTypes.XML);
}
@NotNull
@Override
public DataIndexer<K, V, FileContent> getIndexer() {
return new DataIndexer<K, V, FileContent>() {
@NotNull
@Override
public Map<K, V> map(@NotNull FileContent inputData) {
IdeaPlugin plugin = obtainIdeaPlugin(inputData);
if (plugin == null) return Collections.emptyMap();
return performIndexing(plugin);
}
};
}
@Nullable
private static IdeaPlugin obtainIdeaPlugin(@NotNull FileContent content) {
CharSequence text = content.getContentAsText();
if (CharArrayUtil.indexOf(text, "<idea-plugin", 0) == -1) {
return null;
}
PsiFile file = content.getPsiFile();
if (!(file instanceof XmlFile)) return null;
return DescriptorUtil.getIdeaPlugin((XmlFile)file);
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2000-2018 JetBrains s.r.o.
* Copyright 2000-2019 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.
@@ -16,59 +16,35 @@
package org.jetbrains.idea.devkit.dom.index;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlElement;
import com.intellij.psi.xml.XmlFile;
import com.intellij.util.Function;
import com.intellij.util.SmartList;
import com.intellij.util.containers.FactoryMap;
import com.intellij.util.indexing.FileContent;
import com.intellij.util.text.CharArrayUtil;
import com.intellij.util.xml.DomElement;
import com.intellij.util.xml.DomUtil;
import com.intellij.util.xml.GenericDomValue;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.devkit.dom.*;
import org.jetbrains.idea.devkit.util.DescriptorUtil;
import java.util.Collections;
import java.util.List;
import java.util.Map;
class RegistrationIndexer {
private final FileContent myContent;
private Map<String, List<RegistrationEntry>> myValueMap;
private final IdeaPlugin myPlugin;
private final Map<String, List<RegistrationEntry>> myValueMap = FactoryMap.create(s -> new SmartList<>());
RegistrationIndexer(FileContent content) {
myContent = content;
RegistrationIndexer(IdeaPlugin plugin) {
myPlugin = plugin;
}
@NotNull
Map<String, List<RegistrationEntry>> indexFile() {
IdeaPlugin plugin = obtainIdeaPlugin(myContent);
if (plugin == null) return Collections.emptyMap();
myValueMap = FactoryMap.create(s -> new SmartList<>());
process(plugin);
process(myPlugin);
return myValueMap;
}
@Nullable
static IdeaPlugin obtainIdeaPlugin(@NotNull FileContent content) {
CharSequence text = content.getContentAsText();
if (CharArrayUtil.indexOf(text, "<idea-plugin", 0) == -1) {
return null;
}
PsiFile file = content.getPsiFile();
if (!(file instanceof XmlFile)) return null;
return DescriptorUtil.getIdeaPlugin((XmlFile)file);
}
private void process(IdeaPlugin ideaPlugin) {
processActions(ideaPlugin);