Skip to content

Commit 9100f66

Browse files
committed
Refresh editors using LSP instead of close+open.
Refreshing by toggling the language (causing a close+open) might lead to requests coming in while the file is closed, therefore causing confusing errors.
1 parent 81a9f66 commit 9100f66

2 files changed

Lines changed: 19 additions & 5 deletions

File tree

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

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -945,8 +945,6 @@ public synchronized void registerLanguage(LanguageParameter lang) {
945945
this.registeredExtensions.put(extension, lang.getName());
946946
}
947947

948-
updateCapabilities();
949-
950948
// If we opened any files with this extension before, now associate them with contributions
951949
var extensions = Arrays.asList(lang.getExtensions());
952950
for (var f : getOpenFiles()) {
@@ -955,13 +953,30 @@ public synchronized void registerLanguage(LanguageParameter lang) {
955953
refreshFileState(f);
956954
}
957955
}
956+
957+
// Do this last, after the parser for open editors has been updated,
958+
// since this might trigger new requests on the editor contents.
959+
updateCapabilities();
960+
}
961+
962+
private CompletableFuture<Void> refreshEditors() {
963+
return CompletableFutureUtils.reduce(List.of(
964+
availableClient().refreshCodeLenses(),
965+
availableClient().refreshDiagnostics(),
966+
availableClient().refreshFoldingRanges(),
967+
availableClient().refreshInlayHints(),
968+
availableClient().refreshInlineValues(),
969+
availableClient().refreshSemanticTokens()
970+
), (v1, v2) -> null);
958971
}
959972

960973
private synchronized CompletableFuture<Void> updateCapabilities() {
961974
// `CapabilityRegistration::update` should never be called asynchronously, since that might re-order incoming updates.
962975
// Since `registerLanguage` is called from a single-threaded pool, calling it here is safe.
963976
// Note: `CapabilityRegistration::update` returns a void future, which we do not have to wait on.
964-
return availableCapabilities().update(buildLanguageParams());
977+
return availableCapabilities()
978+
.update(buildLanguageParams())
979+
.thenCompose(v -> refreshEditors());
965980
}
966981

967982
/**

rascal-vscode-extension/src/lsp/ParameterizedLanguageServer.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,7 @@ export class ParameterizedLanguageServer implements vscode.Disposable {
102102
for (const doc of vscode.workspace.textDocuments) {
103103
const ext = path.extname(doc.uri.path);
104104
if (ext !== "" && lang.extensions.includes(ext.substring(1))) {
105-
// (Re)set the language ID to re-trigger contribution requests
106-
await vscode.languages.setTextDocumentLanguage(doc, "plaintext");
105+
// Associate open editors with the given extensions with this language server
107106
await vscode.languages.setTextDocumentLanguage(doc, this.languageId);
108107
}
109108
}

0 commit comments

Comments
 (0)