From ed89c647dba7203b1583efb5f76546849063b7e5 Mon Sep 17 00:00:00 2001 From: LeoAnders Date: Wed, 8 Oct 2025 00:22:11 -0300 Subject: [PATCH] fix: align Ctrl+Click navigation flow with F12 for smoother and consistent definition jumps --- src/ccs/commands/followDefinitionLink.ts | 32 ++++++++++++++++++++++++ src/ccs/index.ts | 1 + src/extension.ts | 18 ++----------- 3 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 src/ccs/commands/followDefinitionLink.ts diff --git a/src/ccs/commands/followDefinitionLink.ts b/src/ccs/commands/followDefinitionLink.ts new file mode 100644 index 00000000..b5f81ad3 --- /dev/null +++ b/src/ccs/commands/followDefinitionLink.ts @@ -0,0 +1,32 @@ +import * as vscode from "vscode"; + +import { lookupCcsDefinition } from "../features/definitionLookup/lookup"; + +export async function followDefinitionLink(documentUri: string, line: number, character: number): Promise { + if (!documentUri || typeof line !== "number" || typeof character !== "number") { + return; + } + + const uri = vscode.Uri.parse(documentUri); + const document = + vscode.workspace.textDocuments.find((doc) => doc.uri.toString() === documentUri) ?? + (await vscode.workspace.openTextDocument(uri)); + + const position = new vscode.Position(line, character); + const tokenSource = new vscode.CancellationTokenSource(); + + try { + const location = await lookupCcsDefinition(document, position, tokenSource.token); + if (location) { + await vscode.window.showTextDocument(location.uri, { selection: location.range }); + return; + } + + await vscode.window.showTextDocument(document, { + selection: new vscode.Range(position, position), + }); + await vscode.commands.executeCommand("editor.action.revealDefinition"); + } finally { + tokenSource.dispose(); + } +} diff --git a/src/ccs/index.ts b/src/ccs/index.ts index 88212849..9d0e709b 100644 --- a/src/ccs/index.ts +++ b/src/ccs/index.ts @@ -14,6 +14,7 @@ export { type QueryKind, } from "./features/definitionLookup/extractQuery"; export { goToDefinitionLocalFirst } from "./commands/goToDefinitionLocalFirst"; +export { followDefinitionLink } from "./commands/followDefinitionLink"; export { PrioritizedDefinitionProvider } from "./providers/PrioritizedDefinitionProvider"; export { DefinitionDocumentLinkProvider, diff --git a/src/extension.ts b/src/extension.ts index 6f6c9133..2206b0d9 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -167,6 +167,7 @@ import { PrioritizedDefinitionProvider, DefinitionDocumentLinkProvider, followDefinitionLinkCommand, + followDefinitionLink, goToDefinitionLocalFirst, resolveContextExpression, showGlobalDocumentation, @@ -1298,22 +1299,7 @@ export async function activate(context: vscode.ExtensionContext): Promise { followDefinitionLinkCommand, async (documentUri: string, line: number, character: number) => { sendCommandTelemetryEvent("ccs.followDefinitionLink"); - if (!documentUri || typeof line !== "number" || typeof character !== "number") { - return; - } - - const uri = vscode.Uri.parse(documentUri); - const document = - vscode.workspace.textDocuments.find((doc) => doc.uri.toString() === documentUri) ?? - (await vscode.workspace.openTextDocument(uri)); - - const position = new vscode.Position(line, character); - const selectionRange = new vscode.Range(position, position); - const editor = await vscode.window.showTextDocument(document, { selection: selectionRange }); - editor.selection = new vscode.Selection(position, position); - editor.revealRange(selectionRange); - - await goToDefinitionLocalFirst(); + await followDefinitionLink(documentUri, line, character); } ), vscode.commands.registerCommand("vscode-objectscript.debug", (program: string, askArgs: boolean) => {