diff --git a/Extension/src/LanguageServer/Providers/goToDefinitionProvider.ts b/Extension/src/LanguageServer/Providers/goToDefinitionProvider.ts index 80fb17c34..ec103fcde 100644 --- a/Extension/src/LanguageServer/Providers/goToDefinitionProvider.ts +++ b/Extension/src/LanguageServer/Providers/goToDefinitionProvider.ts @@ -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 = + new RequestType('textDocument/definition'); + +const DefinitionForAgentRequest: RequestType = + new RequestType('cpptools/definitionForAgent'); + function convertDefinitionsToLocations(definitionsResult: vscode.Definition | vscode.DefinitionLink[] | undefined): vscode.Location[] { if (!definitionsResult) { return []; @@ -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 { +async function sendGoToDefinitionRequest( + client: DefaultClient, + uri: vscode.Uri, + position: vscode.Position, + token: vscode.CancellationToken, + requestType: RequestType +): Promise { 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; @@ -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 { + return sendGoToDefinitionRequest(client, uri, position, token, StandardDefinitionRequest); +} + +export function sendGoToDefinitionForAgentRequest( + client: DefaultClient, + uri: vscode.Uri, + position: vscode.Position, + token: vscode.CancellationToken +): Promise { + return sendGoToDefinitionRequest(client, uri, position, token, DefinitionForAgentRequest); +} diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index e1857ba9e..c44bb1a90 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -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'; @@ -405,6 +405,7 @@ export async function registerCommands(enabled: boolean): Promise { 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)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.CallHierarchyCallsTo', enabled ? onCallHierarchyCallsTo : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.CallHierarchyCallsFrom', enabled ? onCallHierarchyCallsFrom : onDisabledCommand)); @@ -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 { + 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 {