ProjectFileIndex: added methods to find content root and module for files under exclu...
authornik <Nikolay.Chashnikov@jetbrains.com>
Wed, 13 Aug 2014 09:52:16 +0000 (13:52 +0400)
committernik <Nikolay.Chashnikov@jetbrains.com>
Wed, 13 Aug 2014 16:32:41 +0000 (20:32 +0400)
java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java
platform/projectModel-api/src/com/intellij/openapi/roots/ProjectFileIndex.java
platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectFileIndexImpl.java
platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java

index 4050e3128b5103fbf3135850cfc147e573f46742..d74f7a3d0bff5e9250714cfc7ef3a34635e4d772 100644 (file)
@@ -378,6 +378,8 @@ public class DirectoryIndexTest extends IdeaTestCase {
     assertTrue(info.isIgnored());
     assertTrue(myFileIndex.isExcluded(ignoredFile));
     assertTrue(myFileIndex.isUnderIgnored(ignoredFile));
+    assertNull(myFileIndex.getContentRootForFile(ignoredFile, false));
+    assertNull(myFileIndex.getModuleForFile(ignoredFile, false));
   }
 
   public void testAddModule() throws Exception {
@@ -804,6 +806,10 @@ public class DirectoryIndexTest extends IdeaTestCase {
     PsiTestUtil.addExcludedRoot(myModule, fileExcludeRoot);
     assertFalse(myFileIndex.isInContent(fileExcludeRoot));
     assertFalse(myFileIndex.isInSource(fileExcludeRoot));
+    assertNull(myFileIndex.getContentRootForFile(fileExcludeRoot));
+    assertEquals(myModule1Dir, myFileIndex.getContentRootForFile(fileExcludeRoot, false));
+    assertNull(myFileIndex.getModuleForFile(fileExcludeRoot));
+    assertEquals(myModule, myFileIndex.getModuleForFile(fileExcludeRoot, false));
     assertExcluded(fileExcludeRoot, myModule);
     assertIteratedContent(myFileIndex, null, Arrays.asList(fileExcludeRoot));
 
index 17a7abc2a6944c1d83604d4e2254eab3c5fbb599..fdae3317e74ec370266578f577a0f9ce765daf06 100644 (file)
@@ -49,6 +49,16 @@ public interface ProjectFileIndex extends FileIndex {
   Module getModuleForFile(@NotNull VirtualFile file);
 
   /**
+   * Returns module to which the specified file belongs.
+   *
+   * @param file the file for which the module is requested.
+   * @param honorExclusion if {@code false} the containing module will be returned even if the file is located under a folder marked as excluded
+   * @return the module instance or null if the file does not belong to content of any module.
+   */
+  @Nullable
+  Module getModuleForFile(@NotNull VirtualFile file, boolean honorExclusion);
+
+  /**
    * Returns the order entries which contain the specified file (either in CLASSES or SOURCES).
    *
    * @param file the file for which the order entries are requested.
@@ -88,6 +98,16 @@ public interface ProjectFileIndex extends FileIndex {
   VirtualFile getContentRootForFile(@NotNull VirtualFile file);
 
   /**
+   * Returns the module content root to which the specified file or directory belongs.
+   *
+   * @param file the file or directory for which the information is requested.
+   * @param honorExclusion if {@code false} the containing content root will be returned even if the file is located under a folder marked as excluded
+   * @return the file for the content root, or null if the file does not belong to this project.
+   */
+  @Nullable
+  VirtualFile getContentRootForFile(@NotNull VirtualFile file, final boolean honorExclusion);
+
+  /**
    * Returns the name of the package corresponding to the specified directory.
    *
    * @param dir the directory for which the package name is requested.
index e2417193149ee2088b3dcc40a61494dc664b4918..aec6e11a6d15c31f99f3cd8b5d9bb749063bbf14 100644 (file)
@@ -30,6 +30,7 @@ import com.intellij.openapi.vfs.VfsUtilCore;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.openapi.vfs.VirtualFileFilter;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
 import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
 
@@ -91,10 +92,18 @@ public class ProjectFileIndexImpl extends FileIndexBase implements ProjectFileIn
 
   @Override
   public Module getModuleForFile(@NotNull VirtualFile file) {
+    return getModuleForFile(file, true);
+  }
+
+  @Nullable
+  @Override
+  public Module getModuleForFile(@NotNull VirtualFile file, boolean honorExclusion) {
     if (file instanceof VirtualFileWindow) file = ((VirtualFileWindow)file).getDelegate();
     DirectoryInfo info = getInfoForFileOrDirectory(file);
-    if (!info.isInProject()) return null;
-    return info.getModule();
+    if (info.isInProject() || !honorExclusion && info.isExcluded()) {
+      return info.getModule();
+    }
+    return null;
   }
 
   @Override
@@ -119,9 +128,16 @@ public class ProjectFileIndexImpl extends FileIndexBase implements ProjectFileIn
 
   @Override
   public VirtualFile getContentRootForFile(@NotNull VirtualFile file) {
+    return getContentRootForFile(file, true);
+  }
+
+  @Override
+  public VirtualFile getContentRootForFile(@NotNull VirtualFile file, final boolean honorExclusion) {
     final DirectoryInfo info = getInfoForFileOrDirectory(file);
-    if (!info.isInProject()) return null;
-    return info.getContentRoot();
+    if (info.isInProject() || !honorExclusion && info.isExcluded()) {
+      return info.getContentRoot();
+    }
+    return null;
   }
 
   @Override
index eb04fb6c103e981e4891004bd3c8510ac7abfc79..bc85dabc9aeca28633e40ee68caf2a6a19ae31ce 100644 (file)
@@ -497,10 +497,11 @@ public class RootIndex {
     }
 
     @Nullable
-    private Module findParentModuleForExcluded(@NotNull List<VirtualFile> hierarchy) {
+    private VirtualFile findNearestContentRootForExcluded(@NotNull List<VirtualFile> hierarchy) {
       for (VirtualFile root : hierarchy) {
-        Module module = contentRootOf.get(root);
-        if (module != null) return module;
+        if (contentRootOf.containsKey(root)) {
+          return root;
+        }
       }
       return null;
     }
@@ -604,10 +605,14 @@ public class RootIndex {
     VirtualFile moduleContentRoot = info.findModuleRootInfo(hierarchy);
     VirtualFile libraryClassRoot = info.findLibraryRootInfo(hierarchy, false);
     VirtualFile librarySourceRoot = info.findLibraryRootInfo(hierarchy, true);
-    Module parentModuleForExcluded = null;
-    if (moduleContentRoot == null && libraryClassRoot == null && librarySourceRoot == null) {
-      parentModuleForExcluded = info.findParentModuleForExcluded(hierarchy);
-      if (parentModuleForExcluded == null) {
+    boolean inProject = moduleContentRoot != null || libraryClassRoot != null || librarySourceRoot != null;
+    VirtualFile nearestContentRoot;
+    if (inProject) {
+      nearestContentRoot = moduleContentRoot;
+    }
+    else {
+      nearestContentRoot = info.findNearestContentRootForExcluded(hierarchy);
+      if (nearestContentRoot == null) {
         return new Pair<DirectoryInfo, String>(NonProjectDirectoryInfo.EXCLUDED, null);
       }
     }
@@ -619,10 +624,9 @@ public class RootIndex {
     boolean inLibrarySource = librarySourceRoot != null;
     int typeId = moduleSourceRoot != null ? info.rootTypeId.get(moduleSourceRoot) : 0;
 
-    Module module = parentModuleForExcluded != null ? parentModuleForExcluded : info.contentRootOf.get(moduleContentRoot);
+    Module module = info.contentRootOf.get(nearestContentRoot);
     DirectoryInfo directoryInfo =
-      new DirectoryInfoImpl(root, module, moduleContentRoot, sourceRoot, libraryClassRoot, inModuleSources, inLibrarySource,
-                            parentModuleForExcluded != null, typeId);
+      new DirectoryInfoImpl(root, module, nearestContentRoot, sourceRoot, libraryClassRoot, inModuleSources, inLibrarySource, !inProject, typeId);
 
     String packagePrefix = info.calcPackagePrefix(root, hierarchy, moduleContentRoot, libraryClassRoot, librarySourceRoot);