Skip to content

Commit 7709b6a

Browse files
Merge #6470
6470: Restore semantic token flickering workaround removed in #5697 r=kjeremy a=charlespierce Closes #6452 Info ----- * As discussed in #6452, the `Error('busy')` workaround for semantic token flickering was removed because the underlying issue was believed to be fixed in VS Code. * It turns out that the fix isn't yet complete, so this caused flickering of the semantic highlighting when making rapid edits (e.g. typing quickly). * This PR restores that workaround and makes it slightly more robust, covering all areas of semantic token middleware. Changes ----- * Added middleware functions for `provideDocumentSemanticTokens`, `provideDocumentSemanticTokensEdits`, and `provideDocumentRangeSemanticTokens` to match the 3 possible middleware hooks defined in https://github.com/microsoft/vscode-languageserver-node/blob/master/client/src/common/semanticTokens.ts#L33 * Each intercepts a `null` or `undefined` return and throws an error with the message `busy` instead, which prevents the tokens from being removed and re-added (causing the flickering behavior) Tested ----- * Tested locally that the flickering behavior is gone. * There don't appear to be any significant tests of the VS Code plugin side of things, other than that it loads. Is there somewhere I can / should add tests to cover this behavior? Co-authored-by: Charles Pierce <[email protected]>
2 parents f5b7263 + d2bf2eb commit 7709b6a

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

editors/code/src/client.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as lc from 'vscode-languageclient/node';
22
import * as vscode from 'vscode';
33
import * as ra from '../src/lsp_ext';
44
import * as Is from 'vscode-languageclient/lib/common/utils/is';
5+
import { DocumentSemanticsTokensSignature, DocumentSemanticsTokensEditsSignature, DocumentRangeSemanticTokensSignature } from 'vscode-languageclient/lib/common/semanticTokens';
56
import { assert } from './util';
67

78
function renderCommand(cmd: ra.CommandLink) {
@@ -18,6 +19,13 @@ function renderHoverActions(actions: ra.CommandLinkGroup[]): vscode.MarkdownStri
1819
return result;
1920
}
2021

22+
// Workaround for https://github.com/microsoft/vscode-languageserver-node/issues/576
23+
async function semanticHighlightingWorkaround<R, F extends (...args: any[]) => vscode.ProviderResult<R>>(next: F, ...args: Parameters<F>): Promise<R> {
24+
const res = await next(...args);
25+
if (res == null) throw new Error('busy');
26+
return res;
27+
}
28+
2129
export function createClient(serverPath: string, cwd: string): lc.LanguageClient {
2230
// '.' Is the fallback if no folder is open
2331
// TODO?: Workspace folders support Uri's (eg: file://test.txt).
@@ -41,6 +49,15 @@ export function createClient(serverPath: string, cwd: string): lc.LanguageClient
4149
diagnosticCollectionName: "rustc",
4250
traceOutputChannel,
4351
middleware: {
52+
provideDocumentSemanticTokens(document: vscode.TextDocument, token: vscode.CancellationToken, next: DocumentSemanticsTokensSignature): vscode.ProviderResult<vscode.SemanticTokens> {
53+
return semanticHighlightingWorkaround(next, document, token);
54+
},
55+
provideDocumentSemanticTokensEdits(document: vscode.TextDocument, previousResultId: string, token: vscode.CancellationToken, next: DocumentSemanticsTokensEditsSignature): vscode.ProviderResult<vscode.SemanticTokensEdits | vscode.SemanticTokens> {
56+
return semanticHighlightingWorkaround(next, document, previousResultId, token);
57+
},
58+
provideDocumentRangeSemanticTokens(document: vscode.TextDocument, range: vscode.Range, token: vscode.CancellationToken, next: DocumentRangeSemanticTokensSignature): vscode.ProviderResult<vscode.SemanticTokens> {
59+
return semanticHighlightingWorkaround(next, document, range, token);
60+
},
4461
async provideHover(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, _next: lc.ProvideHoverSignature) {
4562
return client.sendRequest(lc.HoverRequest.type, client.code2ProtocolConverter.asTextDocumentPositionParams(document, position), token).then(
4663
(result) => {

0 commit comments

Comments
 (0)