mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
optimization: avoid computing dir info twice
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user