From a9856667a14a9a9e3ba948799d773f4c5fd670cb Mon Sep 17 00:00:00 2001 From: Tomasz Pasternak Date: Tue, 18 Jun 2024 16:18:47 +0200 Subject: [PATCH] fix: Missing directories when view_project_root is on fixes #6492 --- .../base/sync/projectview/ImportRoots.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/base/src/com/google/idea/blaze/base/sync/projectview/ImportRoots.java b/base/src/com/google/idea/blaze/base/sync/projectview/ImportRoots.java index 02b1416f2806..c13d2bc40bed 100644 --- a/base/src/com/google/idea/blaze/base/sync/projectview/ImportRoots.java +++ b/base/src/com/google/idea/blaze/base/sync/projectview/ImportRoots.java @@ -42,12 +42,17 @@ import com.google.idea.common.experiments.BoolExperiment; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; +import org.jetbrains.annotations.NotNull; +import java.io.File; import java.nio.file.FileSystems; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Objects; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; import java.util.Set; import javax.annotation.Nullable; @@ -148,10 +153,7 @@ public ImportRoots build() { } if (viewProjectRoot) { - Arrays.stream(Objects.requireNonNull(workspaceRoot.directory().listFiles())) - .filter(f -> f.isDirectory() && rootDirectoriesBuilder.build().stream().noneMatch(r -> FileUtil.filesEqual(workspaceRoot.fileForPath(r), f))) - .map(workspaceRoot::workspacePathFor) - .forEach(excludeDirectoriesBuilder::add); + selectExcludes(rootDirectoriesBuilder.build()).forEach(excludeDirectoriesBuilder::add); } ImmutableSet minimalExcludes = @@ -176,6 +178,20 @@ public ImportRoots build() { return new ImportRoots(directories, targets); } + private @NotNull List selectExcludes(ImmutableCollection rootDirectories) { + Queue files = new LinkedList<>(Arrays.asList(workspaceRoot.directory().listFiles())); + var result = new ArrayList(); + while (!files.isEmpty()) { + File file = files.poll(); + if (rootDirectories.stream().anyMatch(d -> FileUtil.isAncestor(file, workspaceRoot.fileForPath(d), /*strict=*/ true))) { + files.addAll(Arrays.asList(file.listFiles())); + } else if (rootDirectories.stream().noneMatch(d -> FileUtil.filesEqual(file, workspaceRoot.fileForPath(d)))) { + result.add(file); + } + } + return result.stream().map(workspaceRoot::workspacePathFor).toList(); + } + private void excludeBuildSystemArtifacts() { for (String dir : BuildSystemProvider.getBuildSystemProvider(buildSystemName)