IndexableSetContributor: log.error if a provider returns a set containing null; add... webstorm/144.823
authorSergey Simonchik <sergey.simonchik@jetbrains.com>
Tue, 3 Nov 2015 10:04:01 +0000 (13:04 +0300)
committerSergey Simonchik <sergey.simonchik@jetbrains.com>
Tue, 3 Nov 2015 10:04:01 +0000 (13:04 +0300)
platform/indexing-api/src/com/intellij/util/indexing/IndexableSetContributor.java
platform/indexing-impl/src/com/intellij/util/indexing/AdditionalIndexableFileSet.java

index 06e841aba7059d5c6ba52091e923a14107edf219..e4ba52e1cbcb11b7696b58a33d02a384a9e8a161 100644 (file)
@@ -15,6 +15,7 @@
  */
 package com.intellij.util.indexing;
 
+import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.openapi.vfs.VirtualFileManager;
@@ -32,6 +33,7 @@ import java.util.Set;
 public abstract class IndexableSetContributor implements IndexedRootsProvider {
   
   protected static final Set<VirtualFile> EMPTY_FILE_SET = Collections.emptySet();
+  private static final Logger LOG = Logger.getInstance(IndexableSetContributor.class);
 
   @Override
   public final Set<String> getRootsToIndex() {
@@ -47,14 +49,19 @@ public abstract class IndexableSetContributor implements IndexedRootsProvider {
   @NotNull
   public static Set<VirtualFile> getProjectRootsToIndex(IndexedRootsProvider provider, Project project) {
     if (provider instanceof IndexableSetContributor) {
-      return ((IndexableSetContributor)provider).getAdditionalProjectRootsToIndex(project);
+      IndexableSetContributor contributor = (IndexableSetContributor)provider;
+      Set<VirtualFile> roots = contributor.getAdditionalProjectRootsToIndex(project);
+      return filterOutNulls(contributor, "getAdditionalProjectRootsToIndex(Project)", roots);
     }
     return EMPTY_FILE_SET;
   }
 
+  @NotNull
   public static Set<VirtualFile> getRootsToIndex(IndexedRootsProvider provider) {
     if (provider instanceof IndexableSetContributor) {
-      return ((IndexableSetContributor)provider).getAdditionalRootsToIndex();
+      IndexableSetContributor contributor = (IndexableSetContributor)provider;
+      Set<VirtualFile> roots = contributor.getAdditionalRootsToIndex();
+      return filterOutNulls(contributor, "getAdditionalRootsToIndex()", roots);
     }
 
     final HashSet<VirtualFile> result = new HashSet<VirtualFile>();
@@ -65,11 +72,35 @@ public abstract class IndexableSetContributor implements IndexedRootsProvider {
     return result;
   }
 
+  /**
+   * @return an additional project-dependent set of {@link VirtualFile} instances to index,
+   *         the returned set should not contain nulls
+   */
   @NotNull
   public Set<VirtualFile> getAdditionalProjectRootsToIndex(@NotNull Project project) {
     return EMPTY_FILE_SET;
   }
 
+  /**
+   * @return an additional project-independent set of {@link VirtualFile} instances to index,
+   *         the returned set should not contain nulls
+   */
   @NotNull
   public abstract Set<VirtualFile> getAdditionalRootsToIndex();
+
+  @NotNull
+  private static Set<VirtualFile> filterOutNulls(@NotNull IndexableSetContributor contributor,
+                                                 @NotNull String methodInfo,
+                                                 @NotNull Set<VirtualFile> roots) {
+    for (VirtualFile root : roots) {
+      if (root == null) {
+        LOG.error("Please fix " + contributor.getClass().getName() + "#" + methodInfo + ".\n" +
+                  "The returned set is not expected to contain nulls, but it is " + roots);
+        Set<VirtualFile> result = ContainerUtil.newHashSet(roots.size());
+        ContainerUtil.addAllNotNull(result, roots);
+        return result;
+      }
+    }
+    return roots;
+  }
 }
index 3ae826c4e8d610d03d98b2ebbbfc5f83fb072bb4..315234b03af901978d85167804482816b7a29146 100644 (file)
@@ -69,16 +69,12 @@ public class AdditionalIndexableFileSet implements IndexableFileSet {
     }
     for (IndexedRootsProvider provider : myExtensions) {
       for (VirtualFile root : IndexableSetContributor.getRootsToIndex(provider)) {
-        if (root != null) {
-          (root.isDirectory() ? directories : files).add(root);
-        }
+        (root.isDirectory() ? directories : files).add(root);
       }
       if (myProject != null) {
         Set<VirtualFile> projectRoots = IndexableSetContributor.getProjectRootsToIndex(provider, myProject);
         for (VirtualFile root : projectRoots) {
-          if (root != null) {
-            (root.isDirectory() ? directories : files).add(root);
-          }
+          (root.isDirectory() ? directories : files).add(root);
         }
       }
     }