From b9efff2ae4789ddc3b2d74ddad7be6dc5a203a54 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 16 Apr 2019 15:46:09 +0300 Subject: [PATCH] optimization: avoid computing dir info twice --- .../openapi/roots/impl/FileIndexBase.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/FileIndexBase.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/FileIndexBase.java index 916769629dd3..fbb07504df4d 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/FileIndexBase.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/FileIndexBase.java @@ -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 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);