Files
rust/editors/code/src/inlay_hints.ts

55 lines
2.3 KiB
TypeScript
Raw Normal View History

2019-07-23 16:38:21 +03:00
import * as vscode from 'vscode';
import * as ra from './lsp_ext';
2019-12-30 21:28:38 +01:00
import { Ctx, Disposable } from './ctx';
2021-02-09 12:39:40 +02:00
import { sendRequestWithRetry, isRustDocument } from './util';
export function activateInlayHints(ctx: Ctx) {
const maybeUpdater = {
2021-02-09 12:39:40 +02:00
hintsProvider: null as Disposable | null,
updateHintsEventEmitter: new vscode.EventEmitter<void>(),
async onConfigChange() {
2021-02-09 12:39:40 +02:00
this.dispose();
const anyEnabled = ctx.config.inlayHints.typeHints
|| ctx.config.inlayHints.parameterHints
|| ctx.config.inlayHints.chainingHints;
const enabled = ctx.config.inlayHints.enable && anyEnabled;
2021-02-09 12:39:40 +02:00
if (!enabled) return;
const event = this.updateHintsEventEmitter.event;
this.hintsProvider = vscode.languages.registerInlayHintsProvider({ scheme: 'file', language: 'rust' }, new class implements vscode.InlayHintsProvider {
onDidChangeInlayHints = event;
async provideInlayHints(document: vscode.TextDocument, range: vscode.Range, token: vscode.CancellationToken): Promise<vscode.InlayHint[]> {
const request = { textDocument: { uri: document.uri.toString() }, range: { start: range.start, end: range.end } };
2022-02-09 19:13:17 +02:00
const hints = await sendRequestWithRetry(ctx.client, ra.inlayHints, request, token).catch(_ => null);
2021-02-09 12:39:40 +02:00
if (hints == null) {
return [];
} else {
return hints;
}
}
});
},
2021-02-09 12:39:40 +02:00
onDidChangeTextDocument({ contentChanges, document }: vscode.TextDocumentChangeEvent) {
if (contentChanges.length === 0 || !isRustDocument(document)) return;
this.updateHintsEventEmitter.fire();
},
2021-02-09 12:39:40 +02:00
dispose() {
2021-02-09 12:39:40 +02:00
this.hintsProvider?.dispose();
this.hintsProvider = null;
this.updateHintsEventEmitter.dispose();
},
2022-02-09 19:13:17 +02:00
};
ctx.pushCleanup(maybeUpdater);
2021-02-09 12:39:40 +02:00
vscode.workspace.onDidChangeConfiguration(maybeUpdater.onConfigChange, maybeUpdater, ctx.subscriptions);
vscode.workspace.onDidChangeTextDocument(maybeUpdater.onDidChangeTextDocument, maybeUpdater, ctx.subscriptions);
2019-12-30 21:28:38 +01:00
2021-02-07 21:27:21 +03:30
maybeUpdater.onConfigChange().catch(console.error);
2019-12-30 20:21:25 +01:00
}