Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,16 @@
* 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 { Definition, DefinitionLink, Position, RequestType, ResponseError, TextDocumentPositionParams } from 'vscode-languageclient';
import { DefaultClient } from '../client';
import { RequestCancelled, ServerCancelled } from '../protocolFilter';

const StandardDefinitionRequest: RequestType<TextDocumentPositionParams, Definition | DefinitionLink[] | null, void> =
new RequestType<TextDocumentPositionParams, Definition | DefinitionLink[] | null, void>('textDocument/definition');

const DefinitionForAgentRequest: RequestType<TextDocumentPositionParams, Definition | DefinitionLink[] | null, void> =
new RequestType<TextDocumentPositionParams, Definition | DefinitionLink[] | null, void>('cpptools/definitionForAgent');

function convertDefinitionsToLocations(definitionsResult: vscode.Definition | vscode.DefinitionLink[] | undefined): vscode.Location[] {
if (!definitionsResult) {
return [];
Expand All @@ -28,14 +34,20 @@ function convertDefinitionsToLocations(definitionsResult: vscode.Definition | vs
return result;
}

export async function sendGoToDefinitionRequest(client: DefaultClient, uri: vscode.Uri, position: vscode.Position, token: vscode.CancellationToken): Promise<vscode.Location[] | undefined> {
async function sendGoToDefinitionRequest(
client: DefaultClient,
uri: vscode.Uri,
position: vscode.Position,
token: vscode.CancellationToken,
requestType: RequestType<TextDocumentPositionParams, Definition | DefinitionLink[] | null, void>
): 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);
response = await client.languageClient.sendRequest(requestType, params, token);
} catch (e: any) {
if (e instanceof ResponseError && (e.code === RequestCancelled || e.code === ServerCancelled)) {
return undefined;
Expand All @@ -55,3 +67,21 @@ export async function sendGoToDefinitionRequest(client: DefaultClient, uri: vsco

return convertDefinitionsToLocations(result);
}

export function sendStandardGoToDefinitionRequest(
client: DefaultClient,
uri: vscode.Uri,
position: vscode.Position,
token: vscode.CancellationToken
): Promise<vscode.Location[] | undefined> {
return sendGoToDefinitionRequest(client, uri, position, token, StandardDefinitionRequest);
}

export function sendGoToDefinitionForAgentRequest(
client: DefaultClient,
uri: vscode.Uri,
position: vscode.Position,
token: vscode.CancellationToken
): Promise<vscode.Location[] | undefined> {
return sendGoToDefinitionRequest(client, uri, position, token, DefinitionForAgentRequest);
}
19 changes: 17 additions & 2 deletions Extension/src/LanguageServer/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import * as telemetry from '../telemetry';
import { CopilotHoverProvider } from './Providers/CopilotHoverProvider';
import { sendCallHierarchyCallsFromRequest, sendCallHierarchyCallsToRequest, sendPrepareCallHierarchyRequest } from './Providers/callHierarchyProvider';
import { sendFindAllReferencesRequest } from './Providers/findAllReferencesProvider';
import { sendGoToDefinitionRequest } from './Providers/goToDefinitionProvider';
import { sendGoToDefinitionForAgentRequest, sendStandardGoToDefinitionRequest } from './Providers/goToDefinitionProvider';
import { Client, DefaultClient, DoxygenCodeActionCommandArguments, openFileVersions } from './client';
import { ClientCollection } from './clientCollection';
import { CodeActionDiagnosticInfo, CodeAnalysisDiagnosticIdentifiersAndUri, codeAnalysisAllFixes, codeAnalysisCodeToFixes, codeAnalysisFileToCodeActions } from './codeAnalysis';
Expand Down Expand Up @@ -405,6 +405,7 @@ export async function registerCommands(enabled: boolean): Promise<void> {
commandDisposables.push(vscode.commands.registerCommand('C_Cpp.ShowReferencesProgress', enabled ? onShowReferencesProgress : onDisabledCommand));
commandDisposables.push(vscode.commands.registerCommand('C_Cpp.FindAllReferences', enabled ? onFindAllReferences : onDisabledCommand));
commandDisposables.push(vscode.commands.registerCommand('C_Cpp.GoToDefinition', enabled ? onGoToDefinition : onDisabledCommand));
commandDisposables.push(vscode.commands.registerCommand('C_Cpp.GoToDefinitionForAgent', enabled ? onGoToDefinitionForAgent : onDisabledCommand));
commandDisposables.push(vscode.commands.registerCommand('C_Cpp.PrepareCallHierarchy', enabled ? onPrepareCallHierarchy : onDisabledCommand));
Comment on lines 407 to 409
commandDisposables.push(vscode.commands.registerCommand('C_Cpp.CallHierarchyCallsTo', enabled ? onCallHierarchyCallsTo : onDisabledCommand));
commandDisposables.push(vscode.commands.registerCommand('C_Cpp.CallHierarchyCallsFrom', enabled ? onCallHierarchyCallsFrom : onDisabledCommand));
Expand Down Expand Up @@ -893,7 +894,21 @@ async function onGoToDefinition(uri: vscode.Uri, position: vscode.Position, toke
}

await client.ready;
return sendGoToDefinitionRequest(client, uri, position, token ?? CancellationToken.None);
return sendStandardGoToDefinitionRequest(client, uri, position, token ?? CancellationToken.None);
}

async function onGoToDefinitionForAgent(uri: vscode.Uri, position: vscode.Position, token?: vscode.CancellationToken): Promise<vscode.Location[] | undefined> {
if (!uri || !position) {
throw new Error("C_Cpp.GoToDefinitionForAgent requires both a uri and position.");
}

const client: Client = clients.getClientFor(uri);
if (!(client instanceof DefaultClient)) {
return undefined;
}

await client.ready;
return sendGoToDefinitionForAgentRequest(client, uri, position, token ?? CancellationToken.None);
}

async function onPrepareCallHierarchy(uri: vscode.Uri, position: vscode.Position, token?: vscode.CancellationToken): Promise<vscode.CallHierarchyItem[] | undefined> {
Expand Down
Loading