Skip to content

Commit 765894b

Browse files
Clearing diagnostics of transient files after a close event by mimicking a delete (#902)
* Clearing diagnostics of transient files after a close event by mimicking a delete * Fixed member name * Clearing diagnostics of transient Rascal files after a close event by mimicking a delete * Restored debug print --------- Co-authored-by: Davy Landman <[email protected]>
1 parent 953b87c commit 765894b

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import org.eclipse.lsp4j.DocumentSymbol;
7676
import org.eclipse.lsp4j.DocumentSymbolParams;
7777
import org.eclipse.lsp4j.ExecuteCommandOptions;
78+
import org.eclipse.lsp4j.FileDelete;
7879
import org.eclipse.lsp4j.FileRename;
7980
import org.eclipse.lsp4j.FoldingRange;
8081
import org.eclipse.lsp4j.FoldingRangeRequestParams;
@@ -335,14 +336,21 @@ public void didClose(DidCloseTextDocumentParams params) {
335336
throw new ResponseErrorException(unknownFileError(loc, params));
336337
}
337338
facts(loc).close(loc);
339+
exec.execute(() -> {
340+
// If the closed file no longer exists (e.g., if an untitled file is closed without ever having been saved),
341+
// we mimic a delete event to ensure all diagnostics are cleared.
342+
if (!URIResolverRegistry.getInstance().exists(loc)) {
343+
didDeleteFiles(new DeleteFilesParams(List.of(new FileDelete(params.getTextDocument().getUri()))));
344+
}
345+
});
338346
}
339347

340348
@Override
341349
public void didDeleteFiles(DeleteFilesParams params) {
342350
exec.submit(() -> {
343351
// if a file is deleted, and we were tracking it, we remove our diagnostics
344352
for (var f : params.getFiles()) {
345-
if (isLanguageRegistered(URIUtil.assumeCorrectLocation(f.getUri()))) {
353+
if (isLanguageRegistered(Locations.toLoc(f.getUri()))) {
346354
availableClient().publishDiagnostics(new PublishDiagnosticsParams(f.getUri(), List.of()));
347355
}
348356
}

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import org.eclipse.lsp4j.DocumentSymbolParams;
6666
import org.eclipse.lsp4j.ExecuteCommandOptions;
6767
import org.eclipse.lsp4j.FileCreate;
68+
import org.eclipse.lsp4j.FileDelete;
6869
import org.eclipse.lsp4j.FoldingRange;
6970
import org.eclipse.lsp4j.FoldingRangeRequestParams;
7071
import org.eclipse.lsp4j.Hover;
@@ -283,10 +284,17 @@ public void didChange(DidChangeTextDocumentParams params) {
283284
@Override
284285
public void didClose(DidCloseTextDocumentParams params) {
285286
logger.debug("Close: {}", params.getTextDocument());
286-
if (documents.remove(Locations.toLoc(params.getTextDocument())) == null) {
287-
throw new ResponseErrorException(new ResponseError(ResponseErrorCode.InternalError,
288-
"Unknown file: " + Locations.toLoc(params.getTextDocument()), params));
287+
var loc = Locations.toLoc(params.getTextDocument());
288+
if (documents.remove(loc) == null) {
289+
throw new ResponseErrorException(new ResponseError(ResponseErrorCode.InternalError, "Unknown file: " + loc, params));
289290
}
291+
exec.execute(() -> {
292+
// If the closed file no longer exists (e.g., if an untitled file is closed without ever having been saved),
293+
// we mimic a delete event to ensure all diagnostics are cleared.
294+
if (!URIResolverRegistry.getInstance().exists(loc)) {
295+
didDeleteFiles(new DeleteFilesParams(List.of(new FileDelete(params.getTextDocument().getUri()))));
296+
}
297+
});
290298
}
291299

292300
@Override

0 commit comments

Comments
 (0)