From 922ca15b960005e76621327832effab5c4c7deed Mon Sep 17 00:00:00 2001 From: Dave Shoup Date: Thu, 16 Oct 2025 18:06:55 -0400 Subject: [PATCH] add dedicated codelens for copying and editing from read-only statement doc --- package.json | 10 ++++++++++ src/codelens/flinkSqlProvider.ts | 12 ++++++++++++ src/commands/flinkStatements.ts | 30 ++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/package.json b/package.json index f2ff281c6f..608fe0f109 100644 --- a/package.json +++ b/package.json @@ -646,6 +646,12 @@ "icon": "$(output)", "category": "Confluent" }, + { + "command": "confluent.statements.copyAndEdit", + "title": "Copy & Edit", + "icon": "$(copy)", + "category": "Confluent: Flink Statements" + }, { "command": "confluent.statements.create", "icon": "$(cloud-upload)", @@ -1540,6 +1546,10 @@ "command": "confluent.showSidecarOutputChannel", "when": "true" }, + { + "command": "confluent.statements.copyAndEdit", + "when": "false" + }, { "command": "confluent.statements.create", "when": "false" diff --git a/src/codelens/flinkSqlProvider.ts b/src/codelens/flinkSqlProvider.ts index 467739d357..57208315e7 100644 --- a/src/codelens/flinkSqlProvider.ts +++ b/src/codelens/flinkSqlProvider.ts @@ -9,6 +9,7 @@ import { Range, TextDocument, } from "vscode"; +import { FLINKSTATEMENT_URI_SCHEME } from "../documentProviders/flinkStatement"; import { ccloudConnected, uriMetadataSet } from "../emitters"; import { FLINK_CONFIG_COMPUTE_POOL, FLINK_CONFIG_DATABASE } from "../extensionSettings/constants"; import { CCloudResourceLoader } from "../loaders"; @@ -130,6 +131,17 @@ export class FlinkSqlCodelensProvider extends DisposableCollection implements Co }; const resetLens = new CodeLens(range, resetCommand); + if (document.uri.scheme === FLINKSTATEMENT_URI_SCHEME) { + const copyEditCommand: Command = { + title: "Copy & Edit", + command: "confluent.statements.copyAndEdit", + tooltip: "Copy the current statement to a new document and edit it", + arguments: [document.uri], + }; + const copyEditLens = new CodeLens(range, copyEditCommand); + codeLenses.push(copyEditLens); + } + if (computePool && database) { const submitCommand: Command = { title: "▶️ Submit Statement", diff --git a/src/commands/flinkStatements.ts b/src/commands/flinkStatements.ts index cbefb595a6..1edb459c14 100644 --- a/src/commands/flinkStatements.ts +++ b/src/commands/flinkStatements.ts @@ -376,6 +376,32 @@ export async function stopFlinkStatementCommand(statement: FlinkStatement): Prom void vscode.window.showInformationMessage(`Stopped statement ${statement.name}`); } +export async function copyAndEditFlinkStatementCommand(uri: vscode.Uri): Promise { + if (!(uri instanceof vscode.Uri) || uri.scheme !== FLINKSTATEMENT_URI_SCHEME) { + return; + } + + const rm = ResourceManager.getInstance(); + const uriMetadata: UriMetadata | undefined = await rm.getUriMetadata(uri); + if (!uriMetadata) { + // should never happen since this command is only available from existing statements, + // which always have resource-related metadata + return; + } + + // grab the content of the read-only flinksql document + const document: vscode.TextDocument = await vscode.workspace.openTextDocument(uri); + const sqlStatement: string = document.getText(); + + // open a new editable document with the same content and relevant metadata + const editableDoc = await vscode.workspace.openTextDocument({ + language: FLINK_SQL_LANGUAGE_ID, + content: sqlStatement, + }); + await rm.setUriMetadata(editableDoc.uri, uriMetadata); + await vscode.window.showTextDocument(editableDoc, { preview: false }); +} + export function registerFlinkStatementCommands(): vscode.Disposable[] { return [ registerCommandWithLogging("confluent.statements.viewstatementsql", viewStatementSqlCommand), @@ -384,5 +410,9 @@ export function registerFlinkStatementCommands(): vscode.Disposable[] { registerCommandWithLogging("confluent.flinkStatementResults", openFlinkStatementResultsView), registerCommandWithLogging("confluent.statements.delete", deleteFlinkStatementCommand), registerCommandWithLogging("confluent.statements.stop", stopFlinkStatementCommand), + registerCommandWithLogging( + "confluent.statements.copyAndEdit", + copyAndEditFlinkStatementCommand, + ), ]; }