Skip to content

Commit 0b0186f

Browse files
authored
Cleanup old diagnostics for deleted files (#705)
Fixes #671
1 parent d239369 commit 0b0186f

6 files changed

Lines changed: 76 additions & 10 deletions

File tree

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/BaseWorkspaceService.java

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,12 @@
3939
import org.apache.logging.log4j.Logger;
4040
import org.checkerframework.checker.nullness.qual.Nullable;
4141
import org.eclipse.lsp4j.ClientCapabilities;
42+
import org.eclipse.lsp4j.DeleteFilesParams;
4243
import org.eclipse.lsp4j.DidChangeConfigurationParams;
4344
import org.eclipse.lsp4j.DidChangeWatchedFilesParams;
4445
import org.eclipse.lsp4j.DidChangeWorkspaceFoldersParams;
4546
import org.eclipse.lsp4j.ExecuteCommandParams;
47+
import org.eclipse.lsp4j.FileDelete;
4648
import org.eclipse.lsp4j.FileOperationFilter;
4749
import org.eclipse.lsp4j.FileOperationOptions;
4850
import org.eclipse.lsp4j.FileOperationPattern;
@@ -69,10 +71,13 @@ public class BaseWorkspaceService implements WorkspaceService, LanguageClientAwa
6971
private final IBaseTextDocumentService documentService;
7072
private final CopyOnWriteArrayList<WorkspaceFolder> workspaceFolders = new CopyOnWriteArrayList<>();
7173

74+
private final List<FileOperationPattern> interestedInFiles;
7275

73-
protected BaseWorkspaceService(ExecutorService exec, IBaseTextDocumentService documentService) {
76+
77+
protected BaseWorkspaceService(ExecutorService exec, IBaseTextDocumentService documentService, List<FileOperationPattern> interestedInFiles) {
7478
this.documentService = documentService;
7579
this.ownExecuter = exec;
80+
this.interestedInFiles = interestedInFiles;
7681
}
7782

7883

@@ -93,10 +98,21 @@ public void initialize(ClientCapabilities clientCap, @Nullable List<WorkspaceFol
9398
workspaceCapabilities.setWorkspaceFolders(folderOptions);
9499
}
95100

101+
var fileOperationCapabilities = new FileOperationsServerCapabilities();
102+
var whichFiles = new FileOperationOptions(interestedInFiles.stream()
103+
.map(FileOperationFilter::new)
104+
.collect(Collectors.toList())
105+
);
106+
boolean watchesSet = false;
96107
if (clientWorkspaceCap.getFileOperations().getDidRename()) {
97-
var fileOperationCapabilities = new FileOperationsServerCapabilities();
98-
fileOperationCapabilities.setDidRename(new FileOperationOptions(
99-
List.of(new FileOperationFilter(new FileOperationPattern("**")))));
108+
fileOperationCapabilities.setDidRename(whichFiles);
109+
watchesSet = true;
110+
}
111+
if (clientWorkspaceCap.getFileOperations().getDidDelete()) {
112+
fileOperationCapabilities.setDidDelete(whichFiles);
113+
watchesSet = true;
114+
}
115+
if (watchesSet) {
100116
workspaceCapabilities.setFileOperations(fileOperationCapabilities);
101117
}
102118
}
@@ -139,9 +155,26 @@ public void didChangeWorkspaceFolders(DidChangeWorkspaceFoldersParams params) {
139155
public void didRenameFiles(RenameFilesParams params) {
140156
logger.debug("workspace/didRenameFiles: {}", params.getFiles());
141157

142-
CompletableFuture.supplyAsync(() -> {
158+
ownExecuter.submit(() -> {
143159
documentService.didRenameFiles(params, workspaceFolders());
144-
return null; // Void return type requires a return.
160+
});
161+
162+
ownExecuter.submit(() -> {
163+
// cleanup the old files (we do not get a `didDelete` event)
164+
var oldFiles = params.getFiles().stream()
165+
.map(f -> f.getOldUri())
166+
.map(FileDelete::new)
167+
.collect(Collectors.toList());
168+
documentService.didDeleteFiles(new DeleteFilesParams(oldFiles));
169+
});
170+
}
171+
172+
@Override
173+
public void didDeleteFiles(DeleteFilesParams params) {
174+
logger.debug("workspace/didDeleteFiles: {}", params.getFiles());
175+
176+
ownExecuter.submit(() -> {
177+
documentService.didDeleteFiles(params);
145178
});
146179
}
147180

@@ -153,7 +186,7 @@ public CompletableFuture<Object> executeCommand(ExecuteCommandParams params) {
153186
return documentService.executeCommand(languageName, command).thenApply(v -> v);
154187
}
155188

156-
return CompletableFuture.supplyAsync(() -> params.getCommand() + " was ignored.");
189+
return CompletableFuture.supplyAsync(() -> params.getCommand() + " was ignored.", ownExecuter);
157190
}
158191

159192

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/IBaseTextDocumentService.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.List;
3131
import java.util.concurrent.CompletableFuture;
3232

33+
import org.eclipse.lsp4j.DeleteFilesParams;
3334
import org.eclipse.lsp4j.RenameFilesParams;
3435
import org.eclipse.lsp4j.ServerCapabilities;
3536
import org.eclipse.lsp4j.WorkspaceFolder;
@@ -57,6 +58,7 @@ public interface IBaseTextDocumentService extends TextDocumentService {
5758

5859
boolean isManagingFile(ISourceLocation file);
5960

60-
default void didRenameFiles(RenameFilesParams params, List<WorkspaceFolder> workspaceFolders) {}
61+
void didRenameFiles(RenameFilesParams params, List<WorkspaceFolder> workspaceFolders);
62+
void didDeleteFiles(DeleteFilesParams params);
6163
void cancelProgress(String progressId);
6264
}

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.eclipse.lsp4j.CodeLensParams;
5757
import org.eclipse.lsp4j.Command;
5858
import org.eclipse.lsp4j.DefinitionParams;
59+
import org.eclipse.lsp4j.DeleteFilesParams;
5960
import org.eclipse.lsp4j.Diagnostic;
6061
import org.eclipse.lsp4j.DidChangeTextDocumentParams;
6162
import org.eclipse.lsp4j.DidCloseTextDocumentParams;
@@ -81,6 +82,7 @@
8182
import org.eclipse.lsp4j.PrepareRenameDefaultBehavior;
8283
import org.eclipse.lsp4j.PrepareRenameParams;
8384
import org.eclipse.lsp4j.PrepareRenameResult;
85+
import org.eclipse.lsp4j.PublishDiagnosticsParams;
8486
import org.eclipse.lsp4j.Range;
8587
import org.eclipse.lsp4j.ReferenceParams;
8688
import org.eclipse.lsp4j.RenameFilesParams;
@@ -295,6 +297,19 @@ public void didClose(DidCloseTextDocumentParams params) {
295297
facts(params.getTextDocument()).close(Locations.toLoc(params.getTextDocument()));
296298
}
297299

300+
@Override
301+
public void didDeleteFiles(DeleteFilesParams params) {
302+
ownExecuter.submit(() -> {
303+
// if a file is deleted, and we were tracking it, we remove our diagnostics
304+
for (var f : params.getFiles()) {
305+
if (registeredExtensions.containsKey(extension(f.getUri()))) {
306+
client.publishDiagnostics(new PublishDiagnosticsParams(f.getUri(), List.of()));
307+
}
308+
}
309+
});
310+
}
311+
312+
298313
private void triggerAnalyzer(TextDocumentItem doc, Duration delay) {
299314
triggerAnalyzer(new VersionedTextDocumentIdentifier(doc.getUri(), doc.getVersion()), delay);
300315
}

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricWorkspaceService.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,15 @@
2626
*/
2727
package org.rascalmpl.vscode.lsp.parametric;
2828

29+
import java.util.List;
2930
import java.util.concurrent.ExecutorService;
3031

32+
import org.eclipse.lsp4j.FileOperationPattern;
3133
import org.rascalmpl.vscode.lsp.BaseWorkspaceService;
3234
import org.rascalmpl.vscode.lsp.IBaseTextDocumentService;
3335

3436
public class ParametricWorkspaceService extends BaseWorkspaceService {
3537
ParametricWorkspaceService(ExecutorService exec, IBaseTextDocumentService docService) {
36-
super(exec, docService);
38+
super(exec, docService, List.of(new FileOperationPattern("**/*")));
3739
}
3840
}

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalTextDocumentService.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import org.eclipse.lsp4j.CodeLensParams;
5353
import org.eclipse.lsp4j.Command;
5454
import org.eclipse.lsp4j.DefinitionParams;
55+
import org.eclipse.lsp4j.DeleteFilesParams;
5556
import org.eclipse.lsp4j.Diagnostic;
5657
import org.eclipse.lsp4j.DidChangeTextDocumentParams;
5758
import org.eclipse.lsp4j.DidCloseTextDocumentParams;
@@ -73,6 +74,7 @@
7374
import org.eclipse.lsp4j.PrepareRenameDefaultBehavior;
7475
import org.eclipse.lsp4j.PrepareRenameParams;
7576
import org.eclipse.lsp4j.PrepareRenameResult;
77+
import org.eclipse.lsp4j.PublishDiagnosticsParams;
7678
import org.eclipse.lsp4j.Range;
7779
import org.eclipse.lsp4j.RenameFilesParams;
7880
import org.eclipse.lsp4j.RenameOptions;
@@ -237,6 +239,16 @@ public void didClose(DidCloseTextDocumentParams params) {
237239
}
238240
}
239241

242+
@Override
243+
public void didDeleteFiles(DeleteFilesParams params) {
244+
ownExecuter.submit(() -> {
245+
// if a file is deleted, we remove our diagnostics
246+
for (var f : params.getFiles()) {
247+
client.publishDiagnostics(new PublishDiagnosticsParams(f.getUri(), List.of()));
248+
}
249+
});
250+
}
251+
240252
@Override
241253
public void didSave(DidSaveTextDocumentParams params) {
242254
logger.debug("Save: {}", params.getTextDocument());

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalWorkspaceService.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@
2626
*/
2727
package org.rascalmpl.vscode.lsp.rascal;
2828

29+
import java.util.List;
2930
import java.util.concurrent.ExecutorService;
3031

3132
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
33+
import org.eclipse.lsp4j.FileOperationPattern;
3234
import org.eclipse.lsp4j.services.LanguageClient;
3335
import org.rascalmpl.vscode.lsp.BaseWorkspaceService;
3436
import org.rascalmpl.vscode.lsp.IBaseTextDocumentService;
@@ -37,7 +39,7 @@ public class RascalWorkspaceService extends BaseWorkspaceService {
3739
private @MonotonicNonNull LanguageClient client;
3840

3941
RascalWorkspaceService(ExecutorService exec, IBaseTextDocumentService documentService) {
40-
super(exec, documentService);
42+
super(exec, documentService, List.of(new FileOperationPattern("**/*.rsc")));
4143
}
4244

4345
@Override

0 commit comments

Comments
 (0)