Encapsulate inlay hints activation

This commit is contained in:
Aleksey Kladov 2019-12-30 20:21:25 +01:00
parent b8368f09b4
commit 9ead314005
2 changed files with 39 additions and 38 deletions

View file

@ -1,6 +1,42 @@
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as lc from 'vscode-languageclient'; import * as lc from 'vscode-languageclient';
import { Server } from './server'; import { Server } from './server';
import { Ctx } from './ctx';
export function activateInlayHints(ctx: Ctx) {
const hintsUpdater = new HintsUpdater();
hintsUpdater.refreshHintsForVisibleEditors().then(() => {
// vscode may ignore top level hintsUpdater.refreshHintsForVisibleEditors()
// so update the hints once when the focus changes to guarantee their presence
let editorChangeDisposable: vscode.Disposable | null = null;
editorChangeDisposable = vscode.window.onDidChangeActiveTextEditor(
_ => {
if (editorChangeDisposable !== null) {
editorChangeDisposable.dispose();
}
return hintsUpdater.refreshHintsForVisibleEditors();
},
);
ctx.pushCleanup(
vscode.window.onDidChangeVisibleTextEditors(_ =>
hintsUpdater.refreshHintsForVisibleEditors(),
),
);
ctx.pushCleanup(
vscode.workspace.onDidChangeTextDocument(e =>
hintsUpdater.refreshHintsForVisibleEditors(e),
),
);
ctx.pushCleanup(
vscode.workspace.onDidChangeConfiguration(_ =>
hintsUpdater.toggleHintsDisplay(
Server.config.displayInlayHints,
),
),
);
});
}
interface InlayHintsParams { interface InlayHintsParams {
textDocument: lc.TextDocumentIdentifier; textDocument: lc.TextDocumentIdentifier;
@ -18,7 +54,7 @@ const typeHintDecorationType = vscode.window.createTextEditorDecorationType({
}, },
}); });
export class HintsUpdater { class HintsUpdater {
private displayHints = true; private displayHints = true;
public async toggleHintsDisplay(displayHints: boolean): Promise<void> { public async toggleHintsDisplay(displayHints: boolean): Promise<void> {

View file

@ -2,7 +2,7 @@ import * as vscode from 'vscode';
import * as lc from 'vscode-languageclient'; import * as lc from 'vscode-languageclient';
import * as commands from './commands'; import * as commands from './commands';
import { HintsUpdater } from './inlay_hints'; import { activateInlayHints } from './inlay_hints';
import { StatusDisplay } from './status_display'; import { StatusDisplay } from './status_display';
import * as events from './events'; import * as events from './events';
import * as notifications from './notifications'; import * as notifications from './notifications';
@ -37,10 +37,6 @@ export async function activate(context: vscode.ExtensionContext) {
); );
ctx.pushCleanup(watchStatus); ctx.pushCleanup(watchStatus);
function disposeOnDeactivation(disposable: vscode.Disposable) {
context.subscriptions.push(disposable);
}
// Notifications are events triggered by the language server // Notifications are events triggered by the language server
const allNotifications: [string, lc.GenericNotificationHandler][] = [ const allNotifications: [string, lc.GenericNotificationHandler][] = [
[ [
@ -71,38 +67,7 @@ export async function activate(context: vscode.ExtensionContext) {
} }
if (Server.config.displayInlayHints) { if (Server.config.displayInlayHints) {
const hintsUpdater = new HintsUpdater(); activateInlayHints(ctx);
hintsUpdater.refreshHintsForVisibleEditors().then(() => {
// vscode may ignore top level hintsUpdater.refreshHintsForVisibleEditors()
// so update the hints once when the focus changes to guarantee their presence
let editorChangeDisposable: vscode.Disposable | null = null;
editorChangeDisposable = vscode.window.onDidChangeActiveTextEditor(
_ => {
if (editorChangeDisposable !== null) {
editorChangeDisposable.dispose();
}
return hintsUpdater.refreshHintsForVisibleEditors();
},
);
disposeOnDeactivation(
vscode.window.onDidChangeVisibleTextEditors(_ =>
hintsUpdater.refreshHintsForVisibleEditors(),
),
);
disposeOnDeactivation(
vscode.workspace.onDidChangeTextDocument(e =>
hintsUpdater.refreshHintsForVisibleEditors(e),
),
);
disposeOnDeactivation(
vscode.workspace.onDidChangeConfiguration(_ =>
hintsUpdater.toggleHintsDisplay(
Server.config.displayInlayHints,
),
),
);
});
} }
} }