From 59d0b9b9cdc26e9487ea12c1791a26415b83c3c7 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 21 Jan 2019 13:51:58 +0300 Subject: [PATCH] migrate DirectoryIndexExcludePolicy.getExcludeRootsForProject() to getExcludeUrlsForProject() to be able to monitor creation/deletion of excluded directories (provided by extension point) and fire corresponding rootsChanged --- .../impl/ExcludeCompilerOutputPolicy.java | 10 +++++----- .../DumpVfsInfoForExcludedFilesAction.java | 5 ++--- .../impl/ProjectRootManagerComponent.java | 7 +++++++ .../ui/configuration/ContentEntryEditor.java | 6 +++--- .../impl/DirectoryIndexExcludePolicy.java | 18 +++++++++++++++++- .../intellij/openapi/roots/impl/RootIndex.java | 4 +++- .../vcs/changes/ChangeListManagerImpl.java | 4 ++-- .../ProjectExcludesIgnoredFileProvider.kt | 8 ++++++-- .../python/PyDirectoryIndexExcludePolicy.java | 14 ++++++-------- 9 files changed, 51 insertions(+), 25 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/openapi/roots/impl/ExcludeCompilerOutputPolicy.java b/java/compiler/impl/src/com/intellij/openapi/roots/impl/ExcludeCompilerOutputPolicy.java index b5c9d3d4a552..0ff4a5a80a56 100644 --- a/java/compiler/impl/src/com/intellij/openapi/roots/impl/ExcludeCompilerOutputPolicy.java +++ b/java/compiler/impl/src/com/intellij/openapi/roots/impl/ExcludeCompilerOutputPolicy.java @@ -19,8 +19,8 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.CompilerModuleExtension; import com.intellij.openapi.roots.CompilerProjectExtension; import com.intellij.openapi.roots.ModuleRootModel; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.pointers.VirtualFilePointer; +import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -38,13 +38,13 @@ public class ExcludeCompilerOutputPolicy implements DirectoryIndexExcludePolicy @NotNull @Override - public VirtualFile[] getExcludeRootsForProject() { + public String[] getExcludeUrlsForProject() { CompilerProjectExtension projectExtension = CompilerProjectExtension.getInstance(myProject); - VirtualFile outputPath = projectExtension == null ? null : projectExtension.getCompilerOutput(); + String outputPath = projectExtension == null ? null : projectExtension.getCompilerOutputUrl(); if (outputPath != null) { - return new VirtualFile[] { outputPath }; + return new String[] { outputPath }; } - return VirtualFile.EMPTY_ARRAY; + return ArrayUtil.EMPTY_STRING_ARRAY; } @NotNull diff --git a/platform/lang-impl/src/com/intellij/internal/DumpVfsInfoForExcludedFilesAction.java b/platform/lang-impl/src/com/intellij/internal/DumpVfsInfoForExcludedFilesAction.java index 752594c69e8d..24fe77cfc498 100644 --- a/platform/lang-impl/src/com/intellij/internal/DumpVfsInfoForExcludedFilesAction.java +++ b/platform/lang-impl/src/com/intellij/internal/DumpVfsInfoForExcludedFilesAction.java @@ -26,6 +26,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -49,9 +50,7 @@ public class DumpVfsInfoForExcludedFilesAction extends DumbAwareAction { Collections.addAll(excludeRoots, ModuleRootManager.getInstance(module).getExcludeRootUrls()); } for (DirectoryIndexExcludePolicy policy : DirectoryIndexExcludePolicy.EP_NAME.getExtensions(project)) { - for (VirtualFile file : policy.getExcludeRootsForProject()) { - excludeRoots.add(file.getUrl()); - } + ContainerUtil.addAll(excludeRoots, policy.getExcludeUrlsForProject()); } if (excludeRoots.isEmpty()) { diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java index 430408cb64ec..430ebc98a218 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java @@ -218,6 +218,13 @@ public class ProjectRootManagerComponent extends ProjectRootManagerImpl implemen ((VirtualFilePointerContainerImpl)container).addAllJarDirectories(recursiveDirUrls, true); files.forEach(path -> container.add(VfsUtilCore.pathToUrl(path))); + // changes in files provided by this method should be watched manually because no-one's bothered to setup correct pointers for them + for (DirectoryIndexExcludePolicy excludePolicy : DirectoryIndexExcludePolicy.EP_NAME.getExtensions(getProject())) { + for (String url : excludePolicy.getExcludeUrlsForProject()) { + container.add(url); + } + } + Disposer.dispose(oldDisposable); // dispose after the re-creating container to keep virtual file pointers from disposing and re-creating back // module roots already fire validity change events, see usages of ProjectRootManagerComponent.getRootsValidityChangedListener diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditor.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditor.java index a9220f05d789..328854a13482 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditor.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditor.java @@ -303,16 +303,16 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb public static boolean isExcludedOrUnderExcludedDirectory(@Nullable Project project, @NotNull ContentEntry entry, @NotNull VirtualFile file) { - Set excludedFiles = ContainerUtil.newHashSet(entry.getExcludeFolderFiles()); + Set excludedUrls = ContainerUtil.newHashSet(entry.getExcludeFolderUrls()); if (project != null) { for (DirectoryIndexExcludePolicy policy : DirectoryIndexExcludePolicy.getExtensions(project)) { - ContainerUtil.addAllNotNull(excludedFiles, policy.getExcludeRootsForProject()); + ContainerUtil.addAll(excludedUrls, policy.getExcludeUrlsForProject()); } } Set sourceRoots = ContainerUtil.set(entry.getSourceFolderFiles()); VirtualFile parent = file; while (parent != null) { - if (excludedFiles.contains(parent)) return true; + if (excludedUrls.contains(parent.getUrl())) return true; if (sourceRoots.contains(parent)) return false; parent = parent.getParent(); } diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexExcludePolicy.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexExcludePolicy.java index acfe0cddc59c..c0b106fc4a50 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexExcludePolicy.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexExcludePolicy.java @@ -9,6 +9,7 @@ import com.intellij.openapi.roots.ModuleRootModel; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.pointers.VirtualFilePointer; import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -20,8 +21,23 @@ import java.util.List; public interface DirectoryIndexExcludePolicy { ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.directoryIndexExcludePolicy"); + /** + * @deprecated Override {@link #getExcludeUrlsForProject()} instead + * + */ + @Deprecated @NotNull - VirtualFile[] getExcludeRootsForProject(); + default VirtualFile[] getExcludeRootsForProject() { + return VirtualFile.EMPTY_ARRAY; + } + + /** + * Supply all file urls (existing as well as not yet created) that should be treated as 'excluded' + */ + @NotNull + default String[] getExcludeUrlsForProject() { + return ContainerUtil.map2Array(getExcludeRootsForProject(), String.class, VirtualFile::getUrl); + } @Nullable default Function> getExcludeSdkRootsStrategy() { diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java index 20c45d023d05..394081c63cda 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java @@ -19,6 +19,7 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.VirtualFileWithId; import com.intellij.openapi.vfs.pointers.VirtualFilePointer; import com.intellij.util.CollectionQuery; @@ -202,7 +203,8 @@ public class RootIndex { } } for (DirectoryIndexExcludePolicy policy : DirectoryIndexExcludePolicy.EP_NAME.getExtensions(project)) { - info.excludedFromProject.addAll(ContainerUtil.filter(policy.getExcludeRootsForProject(), file -> ensureValid(file, policy))); + List files = ContainerUtil.mapNotNull(policy.getExcludeUrlsForProject(), url -> VirtualFileManager.getInstance().findFileByUrl(url)); + info.excludedFromProject.addAll(ContainerUtil.filter(files, file -> ensureValid(file, policy))); Function> fun = policy.getExcludeSdkRootsStrategy(); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java index 88b02ec15f4c..927dcdec4e23 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java @@ -348,8 +348,8 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec void convertExcludedToIgnored() { for (DirectoryIndexExcludePolicy policy : DirectoryIndexExcludePolicy.EP_NAME.getExtensions(myProject)) { - for (VirtualFile file : policy.getExcludeRootsForProject()) { - addDirectoryToIgnoreImplicitly(file.getPath()); + for (String url : policy.getExcludeUrlsForProject()) { + addDirectoryToIgnoreImplicitly(VfsUtilCore.urlToPath(url)); } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ProjectExcludesIgnoredFileProvider.kt b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ProjectExcludesIgnoredFileProvider.kt index 88b1ee3debad..de23ed59e8f2 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ProjectExcludesIgnoredFileProvider.kt +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ProjectExcludesIgnoredFileProvider.kt @@ -8,6 +8,7 @@ import com.intellij.openapi.roots.ProjectFileIndex import com.intellij.openapi.roots.impl.DirectoryIndexExcludePolicy import com.intellij.openapi.vcs.FilePath import com.intellij.openapi.vcs.changes.ui.ChangesComparator +import com.intellij.openapi.vfs.VirtualFileManager class ProjectExcludesIgnoredFileProvider : IgnoredFileProvider { @@ -24,8 +25,11 @@ class ProjectExcludesIgnoredFileProvider : IgnoredFileProvider { val fileIndex = ProjectFileIndex.SERVICE.getInstance(project) for (policy in DirectoryIndexExcludePolicy.EP_NAME.getExtensions(project)) { - for (file in policy.excludeRootsForProject) { - excludes.add(file) + for (url in policy.excludeUrlsForProject) { + val file = VirtualFileManager.getInstance().findFileByUrl(url) + if (file != null) { + excludes.add(file) + } } } diff --git a/python/ide/src/com/jetbrains/python/PyDirectoryIndexExcludePolicy.java b/python/ide/src/com/jetbrains/python/PyDirectoryIndexExcludePolicy.java index cb5ad40c8faa..622ac7d97a81 100644 --- a/python/ide/src/com/jetbrains/python/PyDirectoryIndexExcludePolicy.java +++ b/python/ide/src/com/jetbrains/python/PyDirectoryIndexExcludePolicy.java @@ -24,14 +24,12 @@ import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.roots.impl.DirectoryIndexExcludePolicy; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.pointers.VirtualFilePointer; +import com.intellij.util.ArrayUtil; import com.intellij.util.Function; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; /** * @author traff @@ -47,16 +45,16 @@ public class PyDirectoryIndexExcludePolicy implements DirectoryIndexExcludePolic @NotNull @Override - public VirtualFile[] getExcludeRootsForProject() { - List result = Lists.newArrayList(); + public String[] getExcludeUrlsForProject() { + List result = new ArrayList<>(); for (VirtualFile root : ProjectRootManager.getInstance(myProject).getContentRoots()) { VirtualFile file = root.findChild(".tox"); if (file != null) { - result.add(file); + result.add(file.getUrl()); } } - return result.toArray(VirtualFile.EMPTY_ARRAY); + return ArrayUtil.toStringArray(result); } @Nullable