From 7b199f6a4b7a947d1dad6a74b2b88758497d4efa Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 30 Dec 2019 20:10:40 +0100 Subject: Hints are not commands --- editors/code/src/commands/index.ts | 2 - editors/code/src/commands/inlay_hints.ts | 113 ------------------------------- editors/code/src/inlay_hints.ts | 113 +++++++++++++++++++++++++++++++ editors/code/src/main.ts | 2 +- 4 files changed, 114 insertions(+), 116 deletions(-) delete mode 100644 editors/code/src/commands/inlay_hints.ts create mode 100644 editors/code/src/inlay_hints.ts diff --git a/editors/code/src/commands/index.ts b/editors/code/src/commands/index.ts index 4a2e8e4db..89af4be90 100644 --- a/editors/code/src/commands/index.ts +++ b/editors/code/src/commands/index.ts @@ -10,7 +10,6 @@ import { onEnter } from './on_enter'; import { parentModule } from './parent_module'; import { syntaxTree } from './syntax_tree'; import { expandMacro } from './expand_macro'; -import * as inlayHints from './inlay_hints'; import { run, runSingle } from './runnables'; function collectGarbage(ctx: Ctx): Cmd { @@ -38,7 +37,6 @@ export { parentModule, syntaxTree, onEnter, - inlayHints, collectGarbage, run, runSingle, diff --git a/editors/code/src/commands/inlay_hints.ts b/editors/code/src/commands/inlay_hints.ts deleted file mode 100644 index 6d00152f8..000000000 --- a/editors/code/src/commands/inlay_hints.ts +++ /dev/null @@ -1,113 +0,0 @@ -import * as vscode from 'vscode'; -import * as lc from 'vscode-languageclient'; -import { Server } from '../server'; - -interface InlayHintsParams { - textDocument: lc.TextDocumentIdentifier; -} - -interface InlayHint { - range: vscode.Range; - kind: string; - label: string; -} - -const typeHintDecorationType = vscode.window.createTextEditorDecorationType({ - after: { - color: new vscode.ThemeColor('ralsp.inlayHint'), - }, -}); - -export class HintsUpdater { - private displayHints = true; - - public async toggleHintsDisplay(displayHints: boolean): Promise { - if (this.displayHints !== displayHints) { - this.displayHints = displayHints; - return this.refreshVisibleEditorsHints( - displayHints ? undefined : [], - ); - } - } - - public async refreshHintsForVisibleEditors( - cause?: vscode.TextDocumentChangeEvent, - ): Promise { - if (!this.displayHints) return; - - if ( - cause !== undefined && - (cause.contentChanges.length === 0 || - !this.isRustDocument(cause.document)) - ) { - return; - } - return this.refreshVisibleEditorsHints(); - } - - private async refreshVisibleEditorsHints( - newDecorations?: vscode.DecorationOptions[], - ) { - const promises: Array> = []; - - for (const rustEditor of vscode.window.visibleTextEditors.filter( - editor => this.isRustDocument(editor.document), - )) { - if (newDecorations !== undefined) { - promises.push( - Promise.resolve( - rustEditor.setDecorations( - typeHintDecorationType, - newDecorations, - ), - ), - ); - } else { - promises.push(this.updateDecorationsFromServer(rustEditor)); - } - } - - for (const promise of promises) { - await promise; - } - } - - private isRustDocument(document: vscode.TextDocument): boolean { - return document && document.languageId === 'rust'; - } - - private async updateDecorationsFromServer( - editor: vscode.TextEditor, - ): Promise { - const newHints = await this.queryHints(editor.document.uri.toString()); - if (newHints !== null) { - const newDecorations = newHints.map(hint => ({ - range: hint.range, - renderOptions: { - after: { - contentText: `: ${hint.label}`, - }, - }, - })); - return editor.setDecorations( - typeHintDecorationType, - newDecorations, - ); - } - } - - private async queryHints(documentUri: string): Promise { - const request: InlayHintsParams = { - textDocument: { uri: documentUri }, - }; - const client = Server.client; - return client - .onReady() - .then(() => - client.sendRequest( - 'rust-analyzer/inlayHints', - request, - ), - ); - } -} diff --git a/editors/code/src/inlay_hints.ts b/editors/code/src/inlay_hints.ts new file mode 100644 index 000000000..b975915ca --- /dev/null +++ b/editors/code/src/inlay_hints.ts @@ -0,0 +1,113 @@ +import * as vscode from 'vscode'; +import * as lc from 'vscode-languageclient'; +import { Server } from './server'; + +interface InlayHintsParams { + textDocument: lc.TextDocumentIdentifier; +} + +interface InlayHint { + range: vscode.Range; + kind: string; + label: string; +} + +const typeHintDecorationType = vscode.window.createTextEditorDecorationType({ + after: { + color: new vscode.ThemeColor('ralsp.inlayHint'), + }, +}); + +export class HintsUpdater { + private displayHints = true; + + public async toggleHintsDisplay(displayHints: boolean): Promise { + if (this.displayHints !== displayHints) { + this.displayHints = displayHints; + return this.refreshVisibleEditorsHints( + displayHints ? undefined : [], + ); + } + } + + public async refreshHintsForVisibleEditors( + cause?: vscode.TextDocumentChangeEvent, + ): Promise { + if (!this.displayHints) return; + + if ( + cause !== undefined && + (cause.contentChanges.length === 0 || + !this.isRustDocument(cause.document)) + ) { + return; + } + return this.refreshVisibleEditorsHints(); + } + + private async refreshVisibleEditorsHints( + newDecorations?: vscode.DecorationOptions[], + ) { + const promises: Array> = []; + + for (const rustEditor of vscode.window.visibleTextEditors.filter( + editor => this.isRustDocument(editor.document), + )) { + if (newDecorations !== undefined) { + promises.push( + Promise.resolve( + rustEditor.setDecorations( + typeHintDecorationType, + newDecorations, + ), + ), + ); + } else { + promises.push(this.updateDecorationsFromServer(rustEditor)); + } + } + + for (const promise of promises) { + await promise; + } + } + + private isRustDocument(document: vscode.TextDocument): boolean { + return document && document.languageId === 'rust'; + } + + private async updateDecorationsFromServer( + editor: vscode.TextEditor, + ): Promise { + const newHints = await this.queryHints(editor.document.uri.toString()); + if (newHints !== null) { + const newDecorations = newHints.map(hint => ({ + range: hint.range, + renderOptions: { + after: { + contentText: `: ${hint.label}`, + }, + }, + })); + return editor.setDecorations( + typeHintDecorationType, + newDecorations, + ); + } + } + + private async queryHints(documentUri: string): Promise { + const request: InlayHintsParams = { + textDocument: { uri: documentUri }, + }; + const client = Server.client; + return client + .onReady() + .then(() => + client.sendRequest( + 'rust-analyzer/inlayHints', + request, + ), + ); + } +} diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts index 4a3e1ab7c..cf0ddfa16 100644 --- a/editors/code/src/main.ts +++ b/editors/code/src/main.ts @@ -2,7 +2,7 @@ import * as vscode from 'vscode'; import * as lc from 'vscode-languageclient'; import * as commands from './commands'; -import { HintsUpdater } from './commands/inlay_hints'; +import { HintsUpdater } from './inlay_hints'; import { StatusDisplay } from './commands/watch_status'; import * as events from './events'; import * as notifications from './notifications'; -- cgit v1.2.3