From 5e44a135484833ed66dc3ac937f780439f5e7140 Mon Sep 17 00:00:00 2001 From: Brian Leung Date: Thu, 28 May 2020 14:08:15 -0700 Subject: [PATCH] Resolve completions within LspServer.completion() This allows additionalTextEdits to be provided in the textDocument/completion response while abiding by the guideline here: https://github.com/microsoft/language-server-protocol/issues/924 --- server/src/completion.ts | 4 +++- server/src/lsp-server.ts | 27 +++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/server/src/completion.ts b/server/src/completion.ts index 25b6ba42..af950b76 100644 --- a/server/src/completion.ts +++ b/server/src/completion.ts @@ -13,7 +13,8 @@ import { asRange, toTextEdit, asPlainText, asTagsDocumentation, asDocumentation import { Commands } from './commands'; export interface TSCompletionItem extends lsp.CompletionItem { - data: tsp.CompletionDetailsRequestArgs + data: tsp.CompletionDetailsRequestArgs; + hasAction?: true; } export function asCompletionItem(entry: import('typescript/lib/protocol').CompletionEntry, file: string, position: lsp.Position, document: LspDocument): TSCompletionItem { @@ -22,6 +23,7 @@ export function asCompletionItem(entry: import('typescript/lib/protocol').Comple kind: asCompletionItemKind(entry.kind), sortText: entry.sortText, commitCharacters: asCommitCharacters(entry.kind), + hasAction: entry.hasAction, data: { file, line: position.line + 1, diff --git a/server/src/lsp-server.ts b/server/src/lsp-server.ts index b47c244d..6068bdeb 100644 --- a/server/src/lsp-server.ts +++ b/server/src/lsp-server.ts @@ -433,7 +433,8 @@ export class LspServer { includeInsertTextCompletions: true })); const body = result.body || []; - return body.map(entry => asCompletionItem(entry, file, params.position, document)); + + return this.additionalTextEditsResolve(body.map((entry) => asCompletionItem(entry, file, params.position, document))); } catch (error) { if (error.message === "No content available.") { this.logger.info('No content was available for completion request'); @@ -444,7 +445,29 @@ export class LspServer { } } - async completionResolve(item: TSCompletionItem): Promise { + async additionalTextEditsResolve(items: TSCompletionItem[]): Promise { + this.logger.log("completions/additionalTextEditsResolve", items); + return this.interuptDiagnostics(async () => { + return Promise.all( + items.map(async (item) => { + if (!item.hasAction) { + return item; + } + const { body } = await this.tspClient.request( + CommandTypes.CompletionDetails, + item.data + ); + const details = body && body.length && body[0]; + if (!details) { + return item; + } + return asResolvedCompletionItem(item, details); + }) + ); + }); + } + + async completionResolve(item: TSCompletionItem): Promise { this.logger.log('completion/resolve', item); const { body } = await this.interuptDiagnostics(() => this.tspClient.request(CommandTypes.CompletionDetails, item.data)); const details = body && body.length && body[0];