From dda911c253fc38c54603020aa196a0fb84d14612 Mon Sep 17 00:00:00 2001 From: Heyward Fann Date: Wed, 11 Aug 2021 17:30:05 +0800 Subject: [PATCH 1/2] feat: range hover close #836 FYI #256 --- src/client.ts | 17 ++++++++++++++++- src/lsp_ext.ts | 10 +++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/client.ts b/src/client.ts index 5df479d4..c23c27b0 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,9 +1,10 @@ -import { CodeActionKind, Command, Executable, LanguageClient, LanguageClientOptions, ServerOptions, StaticFeature, Uri, workspace } from 'coc.nvim'; +import { CodeActionKind, Command, Executable, LanguageClient, LanguageClientOptions, Position, Range, ServerOptions, StaticFeature, Uri, workspace } from 'coc.nvim'; import { existsSync } from 'fs'; import { join } from 'path'; import { CodeAction, CodeActionParams, CodeActionRequest } from 'vscode-languageserver-protocol'; import { Env } from './config'; import { isRustDocument } from './ctx'; +import * as ra from './lsp_ext'; class ExperimentalFeatures implements StaticFeature { fillClientCapabilities(capabilities: any): void { @@ -62,6 +63,20 @@ export function createClient(bin: string, extra: Env): LanguageClient { documentSelector: [{ language: 'rust' }], initializationOptions, middleware: { + async provideHover(document, position, token) { + let positionOrRange: Range | Position | null = null; + const mode = (await workspace.nvim.call('mode')) as string; + if (mode === 'v' || mode === 'V') { + const doc = workspace.getDocument(document.uri); + positionOrRange = await workspace.getSelectedRange(mode, doc); + } + if (!positionOrRange) positionOrRange = position; + const param: ra.HoverParams = { + position: positionOrRange || position, + textDocument: { uri: document.uri }, + }; + return await client.sendRequest(ra.hover, param, token); + }, async resolveCompletionItem(item, token, next) { if (item.data && !item.data.position) { // TODO: remove this if coc undefined item.data diff --git a/src/lsp_ext.ts b/src/lsp_ext.ts index 2905f32e..9bff239c 100644 --- a/src/lsp_ext.ts +++ b/src/lsp_ext.ts @@ -19,6 +19,14 @@ export const serverStatus = new lc.NotificationType('experim export const reloadWorkspace = new lc.RequestType0('rust-analyzer/reloadWorkspace'); +export const hover = new lc.RequestType('textDocument/hover'); + +export interface HoverParams { + workDoneToken?: lc.ProgressToken; + textDocument: lc.TextDocumentIdentifier; + position: lc.Range | lc.Position; +} + export interface SyntaxTreeParams { textDocument: lc.TextDocumentIdentifier; range: lc.Range | null; @@ -55,7 +63,7 @@ export interface MatchingBraceParams { } export const matchingBrace = new lc.RequestType('experimental/matchingBrace'); -export const parentModule = new lc.RequestType('experimental/parentModule'); +export const parentModule = new lc.RequestType('experimental/parentModule'); export interface JoinLinesParams { textDocument: lc.TextDocumentIdentifier; From be4cb7a7707f8dc06b470ed7e9f8ce7bff950fb0 Mon Sep 17 00:00:00 2001 From: Heyward Fann Date: Thu, 12 Aug 2021 09:23:38 +0800 Subject: [PATCH 2/2] fix: range hover --- src/client.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client.ts b/src/client.ts index c23c27b0..eede1dba 100644 --- a/src/client.ts +++ b/src/client.ts @@ -68,6 +68,7 @@ export function createClient(bin: string, extra: Env): LanguageClient { const mode = (await workspace.nvim.call('mode')) as string; if (mode === 'v' || mode === 'V') { const doc = workspace.getDocument(document.uri); + await workspace.nvim.call('eval', 'feedkeys("\\", "in")'); positionOrRange = await workspace.getSelectedRange(mode, doc); } if (!positionOrRange) positionOrRange = position;