[java-inspections] Test for IDEA-253122 If field is annotated then constructor is...
[idea/community.git] / platform / indexing-api / src / com / intellij / util / indexing / IndexableSetContributor.java
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;
3
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;
14
15 import java.util.Collections;
16 import java.util.LinkedHashSet;
17 import java.util.Set;
18
19 /**
20  * Represents a set of files which should be indexed additionally to a default ones.
21  * <br>
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.
24  */
25 @ApiStatus.OverrideOnly
26 public abstract class IndexableSetContributor {
27
28   public static final ExtensionPointName<IndexableSetContributor> EP_NAME = new ExtensionPointName<>("com.intellij.indexedRootsProvider");
29   private static final Logger LOG = Logger.getInstance(IndexableSetContributor.class);
30
31   @NotNull
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);
35   }
36
37   @NotNull
38   public static Set<VirtualFile> getRootsToIndex(@NotNull IndexableSetContributor contributor) {
39     Set<VirtualFile> roots = contributor.getAdditionalRootsToIndex();
40     return filterOutNulls(contributor, "getAdditionalRootsToIndex()", roots);
41   }
42
43   @ApiStatus.Experimental
44   public boolean acceptFile(@NotNull VirtualFile file, @NotNull VirtualFile root, @Nullable Project project) {
45     return true;
46   }
47
48   /**
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.
51    */
52   @NotNull
53   public Set<VirtualFile> getAdditionalProjectRootsToIndex(@NotNull Project project) {
54     return Collections.emptySet();
55   }
56
57   /**
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.
60    */
61   @NotNull
62   public abstract Set<VirtualFile> getAdditionalRootsToIndex();
63
64   /**
65    * @return contributor's debug name for indexing diagnostic report.
66    */
67   @NonNls
68   @NotNull
69   public String getDebugName() {
70     return toString();
71   }
72
73   @NotNull
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()));
83       }
84     }
85     return roots;
86   }
87 }