diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/capabilities/FileOperationCapability.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/capabilities/FileOperationCapability.java index e9dee16d0..38cac4bf1 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/capabilities/FileOperationCapability.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/capabilities/FileOperationCapability.java @@ -27,6 +27,7 @@ package org.rascalmpl.vscode.lsp.parametric.capabilities; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; @@ -80,13 +81,31 @@ protected final FileOperationOptions mergeOptions(FileOperationOptions o1, FileO .map(FileOperationCapability::extensionFilter) .collect(Collectors.toList()); - var anyFolder = new FileOperationPattern("**/*"); - anyFolder.setMatches(FileOperationPatternKind.Folder); - patterns.add(new FileOperationFilter(anyFolder)); + for (var glob : folderOperationGlobs()) { + var pattern = new FileOperationPattern(glob); + pattern.setMatches(FileOperationPatternKind.Folder); + patterns.add(new FileOperationFilter(pattern)); + } + + for (var glob : fileOperationGlobs()) { + var pattern = new FileOperationPattern(glob); + pattern.setMatches(FileOperationPatternKind.File); + patterns.add(new FileOperationFilter(pattern)); + } return CompletableFutureUtils.completedFuture(new FileOperationOptions(patterns), exec); } + protected List folderOperationGlobs() { + // By default, do receive notifications about each folder + return List.of("**/*"); + } + + protected List fileOperationGlobs() { + // By default, don't receive notifications about any file + return Collections.emptyList(); + } + /** * Options to use when registering statically, i.e. nothing is known about the registered languages. */ @@ -141,6 +160,12 @@ protected void registerStatically(ServerCapabilities result) { fileOperationCapabilities(result).setDidDelete(staticOptions()); } + @Override + protected List fileOperationGlobs() { + // Receiving notifications about extension-less files would be enough, but it seems "extension-less file" + // cannot be expressed using LSP's glob patterns. + return List.of("**/*"); + } } /**