Skip to content

Commit d8a6a98

Browse files
authored
Switch from LSP hover to HoverProvider (#12612)
1 parent 326f7d9 commit d8a6a98

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/* --------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All Rights Reserved.
3+
* See 'LICENSE' in the project root for license information.
4+
* ------------------------------------------------------------------------------------------ */
5+
import * as vscode from 'vscode';
6+
import { Position, ResponseError, TextDocumentPositionParams } from 'vscode-languageclient';
7+
import { DefaultClient, HoverRequest } from '../client';
8+
import { RequestCancelled, ServerCancelled } from '../protocolFilter';
9+
import { CppSettings } from '../settings';
10+
11+
export class HoverProvider implements vscode.HoverProvider {
12+
private client: DefaultClient;
13+
constructor(client: DefaultClient) {
14+
this.client = client;
15+
}
16+
17+
public async provideHover(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Promise<vscode.Hover | undefined> {
18+
const settings: CppSettings = new CppSettings(vscode.workspace.getWorkspaceFolder(document.uri)?.uri);
19+
if (settings.hover === "disabled") {
20+
return undefined;
21+
}
22+
const params: TextDocumentPositionParams = {
23+
textDocument: { uri: document.uri.toString() },
24+
position: Position.create(position.line, position.character)
25+
};
26+
await this.client.ready;
27+
let hoverResult: vscode.Hover;
28+
try {
29+
hoverResult = await this.client.languageClient.sendRequest(HoverRequest, params, token);
30+
} catch (e: any) {
31+
if (e instanceof ResponseError && (e.code === RequestCancelled || e.code === ServerCancelled)) {
32+
throw new vscode.CancellationError();
33+
}
34+
throw e;
35+
}
36+
if (token.isCancellationRequested) {
37+
throw new vscode.CancellationError();
38+
}
39+
// VS Code doesn't like the raw objects returned via RPC, so we need to create proper VS Code objects here.
40+
const strings: vscode.MarkdownString[] = [];
41+
for (const element of hoverResult.contents) {
42+
const oldMarkdownString: vscode.MarkdownString = element as vscode.MarkdownString;
43+
const newMarkdownString: vscode.MarkdownString = new vscode.MarkdownString(oldMarkdownString.value, oldMarkdownString.supportThemeIcons);
44+
newMarkdownString.isTrusted = oldMarkdownString.isTrusted;
45+
newMarkdownString.supportHtml = oldMarkdownString.supportHtml;
46+
newMarkdownString.baseUri = oldMarkdownString.baseUri;
47+
strings.push(newMarkdownString);
48+
}
49+
let range: vscode.Range | undefined;
50+
if (hoverResult.range) {
51+
range = new vscode.Range(hoverResult.range.start.line, hoverResult.range.start.character,
52+
hoverResult.range.end.line, hoverResult.range.end.character);
53+
}
54+
55+
return new vscode.Hover(strings, range);
56+
}
57+
}

Extension/src/LanguageServer/client.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import * as fs from 'fs';
2727
import * as os from 'os';
2828
import { SourceFileConfiguration, SourceFileConfigurationItem, Version, WorkspaceBrowseConfiguration } from 'vscode-cpptools';
2929
import { IntelliSenseStatus, Status } from 'vscode-cpptools/out/testApi';
30-
import { CloseAction, DidOpenTextDocumentParams, ErrorAction, LanguageClientOptions, NotificationType, Position, Range, RequestType, TextDocumentIdentifier } from 'vscode-languageclient';
30+
import { CloseAction, DidOpenTextDocumentParams, ErrorAction, LanguageClientOptions, NotificationType, Position, Range, RequestType, TextDocumentIdentifier, TextDocumentPositionParams } from 'vscode-languageclient';
3131
import { LanguageClient, ServerOptions } from 'vscode-languageclient/node';
3232
import * as nls from 'vscode-nls';
3333
import { DebugConfigurationProvider } from '../Debugger/configurationProvider';
@@ -43,6 +43,7 @@ import { localizedStringCount, lookupString } from '../nativeStrings';
4343
import { SessionState } from '../sessionState';
4444
import * as telemetry from '../telemetry';
4545
import { TestHook, getTestHook } from '../testHook';
46+
import { HoverProvider } from './Providers/HoverProvider';
4647
import {
4748
CodeAnalysisDiagnosticIdentifiersAndUri,
4849
RegisterCodeAnalysisNotifications,
@@ -554,6 +555,7 @@ export const GetFoldingRangesRequest: RequestType<GetFoldingRangesParams, GetFol
554555
export const FormatDocumentRequest: RequestType<FormatParams, FormatResult, void> = new RequestType<FormatParams, FormatResult, void>('cpptools/formatDocument');
555556
export const FormatRangeRequest: RequestType<FormatParams, FormatResult, void> = new RequestType<FormatParams, FormatResult, void>('cpptools/formatRange');
556557
export const FormatOnTypeRequest: RequestType<FormatParams, FormatResult, void> = new RequestType<FormatParams, FormatResult, void>('cpptools/formatOnType');
558+
export const HoverRequest: RequestType<TextDocumentPositionParams, vscode.Hover, void> = new RequestType<TextDocumentPositionParams, vscode.Hover, void>('cpptools/hover');
557559
const CreateDeclarationOrDefinitionRequest: RequestType<CreateDeclarationOrDefinitionParams, CreateDeclarationOrDefinitionResult, void> = new RequestType<CreateDeclarationOrDefinitionParams, CreateDeclarationOrDefinitionResult, void>('cpptools/createDeclDef');
558560
const ExtractToFunctionRequest: RequestType<ExtractToFunctionParams, WorkspaceEditResult, void> = new RequestType<ExtractToFunctionParams, WorkspaceEditResult, void>('cpptools/extractToFunction');
559561
const GoToDirectiveInGroupRequest: RequestType<GoToDirectiveInGroupParams, Position | undefined, void> = new RequestType<GoToDirectiveInGroupParams, Position | undefined, void>('cpptools/goToDirectiveInGroup');
@@ -1255,6 +1257,7 @@ export class DefaultClient implements Client {
12551257
initializedClientCount = 0;
12561258
this.inlayHintsProvider = new InlayHintsProvider();
12571259

1260+
this.disposables.push(vscode.languages.registerHoverProvider(util.documentSelector, new HoverProvider(this)));
12581261
this.disposables.push(vscode.languages.registerInlayHintsProvider(util.documentSelector, this.inlayHintsProvider));
12591262
this.disposables.push(vscode.languages.registerRenameProvider(util.documentSelector, new RenameProvider(this)));
12601263
this.disposables.push(vscode.languages.registerReferenceProvider(util.documentSelector, new FindAllReferencesProvider(this)));

0 commit comments

Comments
 (0)