public void doInvalidateIndicesForFile(int fileId,
                                         @NotNull VirtualFile file,
                                         @NotNull Set<Project> containingProjects,
                                         @NotNull List<Project> dirtyQueueProjects) {
    myIndexableFilesFilterHolder.removeFile(fileId);
    myDirtyFiles.addFile(Collections.emptyList(), fileId); // can be indexed by project which is currently closed
    IndexingFlag.cleanProcessedFlagRecursively(file);

    List<ID<?, ?>> nontrivialFileIndexedStates = IndexingStamp.getNontrivialFileIndexedStates(fileId);

    // transient index value can depend on disk value because former is diff to latter
    // it doesn't matter content froze or not: indices might depend on file name too
    removeTransientFileDataFromIndices(nontrivialFileIndexedStates, fileId, file);

    // The file was removed
    for (ID<?, ?> indexId : nontrivialFileIndexedStates) {
      if (!myRegisteredIndexes.isContentDependentIndex(indexId)) {
        removeSingleIndexValue(indexId, fileId);
      }
    }
    if (nontrivialFileIndexedStates.isEmpty() || (file.isValid() && file.isDirectory())) {
      getFilesToUpdateCollector().removeScheduledFileFromUpdate(file); // no need to update it anymore
    }
    else {
      // its data should be (lazily) wiped for every index
      getFilesToUpdateCollector().scheduleForUpdate(FileIndexingRequest.deleteRequest(file), containingProjects, dirtyQueueProjects);
    }
  }
public void doInvalidateIndicesForFile(int fileId,
                                         @NotNull VirtualFile file,
                                         @NotNull Set<Project> containingProjects,
                                         @NotNull List<Project> dirtyQueueProjects)