optimization: avoid computing dir info twice

This commit is contained in:
Alexey Kudravtsev
2019-04-16 15:47:06 +03:00
parent 00cd440e92
commit b9efff2ae4
@@ -31,17 +31,18 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
import java.util.function.BiPredicate;
/**
* @author nik
*/
public abstract class FileIndexBase implements FileIndex {
abstract class FileIndexBase implements FileIndex {
private final FileTypeRegistry myFileTypeRegistry;
final DirectoryIndex myDirectoryIndex;
private final VirtualFileFilter myContentFilter = file -> {
assert file != null;
return ReadAction.compute(() -> !isScopeDisposed() && isInContent(file));
private final BiPredicate<VirtualFile, DirectoryInfo> myContentFilter = (file, info) -> {
return ReadAction.compute(() -> !isScopeDisposed() && ProjectFileIndexImpl.isFileInContent(file, info));
};
FileIndexBase(@NotNull DirectoryIndex directoryIndex, @NotNull FileTypeRegistry fileTypeManager) {
myDirectoryIndex = directoryIndex;
myFileTypeRegistry = fileTypeManager;
@@ -58,13 +59,12 @@ public abstract class FileIndexBase implements FileIndex {
public boolean iterateContentUnderDirectory(@NotNull final VirtualFile dir,
@NotNull final ContentIterator processor,
@Nullable VirtualFileFilter customFilter) {
final VirtualFileFilter filter = customFilter != null ? myContentFilter.and(customFilter) : myContentFilter;
final VirtualFileVisitor.Result result = VfsUtilCore.visitChildrenRecursively(dir, new VirtualFileVisitor() {
@NotNull
@Override
public Result visitFileEx(@NotNull VirtualFile file) {
DirectoryInfo info = getInfoForFileOrDirectory(file);
if (file.isDirectory()) {
DirectoryInfo info = getInfoForFileOrDirectory(file);
if (info.isExcluded(file)) {
if (!info.processContentBeneathExcluded(file, content -> iterateContentUnderDirectory(content, processor, customFilter))) {
return skipTo(dir);
@@ -72,7 +72,8 @@ public abstract class FileIndexBase implements FileIndex {
return SKIP_CHILDREN;
}
}
return !filter.accept(file) || processor.processFile(file) ? CONTINUE : skipTo(dir);
boolean accepted = myContentFilter.test(file, info) && (customFilter == null || customFilter.accept(file));
return !accepted || processor.processFile(file) ? CONTINUE : skipTo(dir);
}
});
return !Comparing.equal(result.skipToParent, dir);