1 // 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.
2 package com.intellij.util.indexing;
4 import com.intellij.diagnostic.PluginException;
5 import com.intellij.openapi.diagnostic.Logger;
6 import com.intellij.openapi.extensions.ExtensionPointName;
7 import com.intellij.openapi.project.Project;
8 import com.intellij.openapi.vfs.VirtualFile;
9 import com.intellij.util.containers.ContainerUtil;
10 import org.jetbrains.annotations.ApiStatus;
11 import org.jetbrains.annotations.NonNls;
12 import org.jetbrains.annotations.NotNull;
13 import org.jetbrains.annotations.Nullable;
15 import java.util.Collections;
16 import java.util.LinkedHashSet;
20 * Represents a set of files which should be indexed additionally to a default ones.
22 * Files provided by {@link IndexableSetContributor} will be indexed (or ensured up to date) on project loading and
23 * {@link FileBasedIndex} automatically rebuilds indexes for these files when they are going to be changed.
25 @ApiStatus.OverrideOnly
26 public abstract class IndexableSetContributor {
28 public static final ExtensionPointName<IndexableSetContributor> EP_NAME = new ExtensionPointName<>("com.intellij.indexedRootsProvider");
29 private static final Logger LOG = Logger.getInstance(IndexableSetContributor.class);
32 public static Set<VirtualFile> getProjectRootsToIndex(@NotNull IndexableSetContributor contributor, @NotNull Project project) {
33 Set<VirtualFile> roots = contributor.getAdditionalProjectRootsToIndex(project);
34 return filterOutNulls(contributor, "getAdditionalProjectRootsToIndex(Project)", roots);
38 public static Set<VirtualFile> getRootsToIndex(@NotNull IndexableSetContributor contributor) {
39 Set<VirtualFile> roots = contributor.getAdditionalRootsToIndex();
40 return filterOutNulls(contributor, "getAdditionalRootsToIndex()", roots);
43 @ApiStatus.Experimental
44 public boolean acceptFile(@NotNull VirtualFile file, @NotNull VirtualFile root, @Nullable Project project) {
49 * @return an additional project-dependent set of {@link VirtualFile} instances to index,
50 * the returned set should not contain {@code null} files or invalid files.
53 public Set<VirtualFile> getAdditionalProjectRootsToIndex(@NotNull Project project) {
54 return Collections.emptySet();
58 * @return an additional project-independent set of {@link VirtualFile} instances to index,
59 * the returned set should not contain {@code null} files or invalid files.
62 public abstract Set<VirtualFile> getAdditionalRootsToIndex();
65 * @return contributor's debug name for indexing diagnostic report.
69 public String getDebugName() {
74 private static Set<VirtualFile> filterOutNulls(@NotNull IndexableSetContributor contributor,
75 @NotNull String methodInfo,
76 @NotNull Set<VirtualFile> roots) {
77 for (VirtualFile root : roots) {
78 if (root == null || !root.isValid()) {
79 LOG.error(PluginException.createByClass("Please fix " + contributor.getClass().getName() + "#" + methodInfo + ".\n" +
80 (root == null ? "The returned set is not expected to contain nulls, but it is " + roots
81 : "Invalid file returned: " + root), null, contributor.getClass()));
82 return new LinkedHashSet<>(ContainerUtil.filter(roots, virtualFile -> virtualFile != null && virtualFile.isValid()));