-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Expand file tree
/
Copy pathgoToDefinitionProvider.ts
More file actions
58 lines (50 loc) · 2.35 KB
/
Copy pathgoToDefinitionProvider.ts
File metadata and controls
58 lines (50 loc) · 2.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import * as vscode from 'vscode';
import { Definition, DefinitionLink, DefinitionRequest, Position, ResponseError, TextDocumentPositionParams } from 'vscode-languageclient';
import { DefaultClient } from '../client';
import { RequestCancelled, ServerCancelled } from '../protocolFilter';
function convertDefinitionsToLocations(definitionsResult: vscode.Definition | vscode.DefinitionLink[] | undefined): vscode.Location[] {
if (!definitionsResult) {
return [];
}
if (!Array.isArray(definitionsResult)) {
return [definitionsResult];
}
const result: vscode.Location[] = [];
for (const definition of definitionsResult) {
if (definition instanceof vscode.Location) {
result.push(definition);
} else {
result.push(new vscode.Location(definition.targetUri, definition.targetSelectionRange ?? definition.targetRange));
}
}
return result;
}
export async function sendGoToDefinitionRequest(client: DefaultClient, uri: vscode.Uri, position: vscode.Position, token: vscode.CancellationToken): Promise<vscode.Location[] | undefined> {
const params: TextDocumentPositionParams = {
position: Position.create(position.line, position.character),
textDocument: { uri: uri.toString() }
};
let response: Definition | DefinitionLink[] | null;
try {
response = await client.languageClient.sendRequest(DefinitionRequest.type, params, token);
} catch (e: any) {
if (e instanceof ResponseError && (e.code === RequestCancelled || e.code === ServerCancelled)) {
return undefined;
}
throw e;
}
if (token.isCancellationRequested) {
return undefined;
}
const protocol2CodeConverter = await client.languageClient.getProtocol2CodeConverter();
const result: vscode.Definition | vscode.DefinitionLink[] | undefined =
await protocol2CodeConverter.asDefinitionResult(response, token);
if (token.isCancellationRequested) {
return undefined;
}
return convertDefinitionsToLocations(result);
}