[memory-agent] IDEA-253276 Broken default behaviour of "Show referring objects" actio...
[idea/community.git] / platform / projectModel-api / src / com / intellij / openapi / roots / FileIndex.java
index 99eec952f1d9f8c67a7ca24ed97d13406c0f12a4..678948e0f428b5e38315d6b9dc0b0c2794a166a8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2017 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.
  */
 package com.intellij.openapi.roots;
 
+import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.vfs.VirtualFileFilter;
+import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
 
 import java.util.Set;
 
 /**
  * Provides information about files contained in a project or module.
+ * In this interface and its inheritors, methods checking specific file status ("isX", "getX") should be used from a read action.
+ * Iteration methods ("iterateX") may be called outside of a read action (since iteration can take a long time),
+ * but they should be prepared to project model being changed in the middle of the iteration.
  *
  * @see ProjectRootManager#getFileIndex()
  * @see ModuleRootManager#getFileIndex()
  */
+@ApiStatus.NonExtendable
 public interface FileIndex {
   /**
-   * Iterates all files and directories in the content.
+   * Processes all files and directories under content roots skipping excluded and ignored files and directories.
    *
-   * @param iterator the iterator receiving the files.
    * @return false if files processing was stopped ({@link ContentIterator#processFile(VirtualFile)} returned false)
    */
-  boolean iterateContent(@NotNull ContentIterator iterator);
+  boolean iterateContent(@NotNull ContentIterator processor);
 
   /**
-   * Iterates all files and directories in the content under directory <code>dir</code> (including the directory itself).
-   * Does not iterate anything if <code>dir</code> is not in the content.
+   * Same as {@link #iterateContent(ContentIterator)} but allows to pass {@code filter} to
+   * provide filtering in condition for directories.
+   * <p>
+   * If {@code filter} returns false on a directory, the directory won't be processed, but iteration will go on.
+   * <p>
+   * {@code null} filter means that all directories should be processed.
    *
-   * @param dir      the directory the contents of which is iterated.
-   * @param iterator the iterator receiving the files.
    * @return false if files processing was stopped ({@link ContentIterator#processFile(VirtualFile)} returned false)
    */
-  boolean iterateContentUnderDirectory(@NotNull VirtualFile dir, @NotNull ContentIterator iterator);
+  boolean iterateContent(@NotNull ContentIterator processor, @Nullable VirtualFileFilter filter);
 
   /**
-   * Returns true if <code>fileOrDir</code> is a file or directory under a content root of this
-   * project or module.
+   * Processes all files and directories in the content under directory {@code dir} (including the directory itself) skipping excluded
+   * and ignored files and directories. Does nothing if {@code dir} is not in the content.
    *
-   * @param fileOrDir the file or directory to check.
-   * @return true if the file or directory belongs to a content root, false otherwise.
+   * @return false if files processing was stopped ({@link ContentIterator#processFile(VirtualFile)} returned false)
+   */
+  boolean iterateContentUnderDirectory(@NotNull VirtualFile dir, @NotNull ContentIterator processor);
+
+  /**
+   * Same as {@link #iterateContentUnderDirectory(VirtualFile, ContentIterator)} but allows to pass additional {@code customFilter} to
+   * the iterator, in case you need to skip some file system branches using your own logic. If {@code customFilter} returns false on
+   * a directory, it won't be processed, but iteration will go on.
+   * <p>
+   * {@code null} filter means that all directories should be processed.
+   */
+  boolean iterateContentUnderDirectory(@NotNull VirtualFile dir,
+                                       @NotNull ContentIterator processor,
+                                       @Nullable VirtualFileFilter customFilter);
+
+  /**
+   * Returns {@code true} if {@code fileOrDir} is a file or directory under a content root of this project or module and not excluded or
+   * ignored.
    */
   boolean isInContent(@NotNull VirtualFile fileOrDir);
 
   /**
-   * Returns true if <code>file</code> is a source file which belongs to sources of the content.
-   * (Returns true for both source and test source).<p/>
-   * Note that sometimes a file can belong to the content and be a source file but not belong to sources of the content.
-   * This happens if sources of some library are located under the content (so they belong to the project content but not as sources).
-   *
-   * @param file the file to check.
-   * @return true if the file is a source file in the content sources, false otherwise.
+   * @deprecated name of this method is unclear, use {@link #isInSourceContent(VirtualFile)} instead and add {@code !file.isDirectory()} check
+   * if you want to accept files only.
    */
+  @Deprecated
   boolean isContentSourceFile(@NotNull VirtualFile file);
 
   /**
-   * Returns true if <code>fileOrDir</code> is a file or directory from the content source.
-   * (Returns true for both source and test source).
-   *
-   * @param fileOrDir the file or directory to check.
-   * @return true if the file or directory belongs to a source or test source root, false otherwise.
+   * Returns {@code true} if {@code fileOrDir} is a file or directory located under a sources, tests or resources root and not excluded or ignored.
    */
   boolean isInSourceContent(@NotNull VirtualFile fileOrDir);
 
   /**
-   * Returns true if <code>fileOrDir</code> is a file or directory from the test content source
+   * Returns true if {@code fileOrDir} is a file or directory located under a test sources or resources root and not excluded or ignored.
+   * <p>
+   * Use this method when you really need to check whether the file is under test roots according to project configuration.
+   * <p>
+   * If you want to determine whether file should be considered as test (e.g. for implementing SearchScope)
+   * you'd better use {@link TestSourcesFilter#isTestSources(VirtualFile, Project)} instead
+   * which includes {@link ProjectFileIndex#isInTestSourceContent(VirtualFile)} invocation.
    *
-   * @param fileOrDir the file or directory to check.
-   * @return true if the file or directory belongs to a test source root, false otherwise.
+   * @see TestSourcesFilter#isTestSources(VirtualFile, Project)
    */
   boolean isInTestSourceContent(@NotNull VirtualFile fileOrDir);
 
   /**
-   * Returns true if <code>fileOrDir</code> is a file or directory from the source root which have
-   *
-   * @param fileOrDir the file or directory to check.
-   * @return true if the file or directory belongs to a source root of one of specified types, false otherwise
+   * Returns {@code true} if {@code fileOrDir} is a file or directory located under a source root of type from {@code rootTypes} set and not excluded or ignored
    */
   boolean isUnderSourceRootOfType(@NotNull VirtualFile fileOrDir, @NotNull Set<? extends JpsModuleSourceRootType<?>> rootTypes);
 }