From 4e600e8770ff66c93d753fc7853707b7597428a8 Mon Sep 17 00:00:00 2001 From: Sanjula Ganepola Date: Wed, 1 Oct 2025 09:50:29 -0400 Subject: [PATCH 1/2] Add code action to generate binder source Signed-off-by: Sanjula Ganepola --- extension/client/src/commands.ts | 7 ++++- extension/server/src/providers/codeActions.ts | 28 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/extension/client/src/commands.ts b/extension/client/src/commands.ts index a1a56997..4c981a27 100644 --- a/extension/client/src/commands.ts +++ b/extension/client/src/commands.ts @@ -1,9 +1,14 @@ -import { commands, ExtensionContext, Uri, window } from "vscode"; +import { commands, ExtensionContext, Uri, window, workspace } from "vscode"; import { clearTableCache, getCache } from "./requests"; import { LanguageClient } from "vscode-languageclient/node"; export function registerCommands(context: ExtensionContext, client: LanguageClient) { context.subscriptions.push( + commands.registerCommand(`vscode-rpgle.generateBinderSource`, async (content: string) => { + const document = await workspace.openTextDocument({ language: `bnd`, content: content }); + await window.showTextDocument(document); + }), + commands.registerCommand(`vscode-rpgle.server.reloadCache`, () => { clearTableCache(client); }), diff --git a/extension/server/src/providers/codeActions.ts b/extension/server/src/providers/codeActions.ts index ef2e9a8d..2d4019ed 100644 --- a/extension/server/src/providers/codeActions.ts +++ b/extension/server/src/providers/codeActions.ts @@ -4,6 +4,7 @@ import { documents, parser } from '.'; import Cache from '../../../../language/models/cache'; import { getLinterCodeActions } from './linter/codeActions'; import { createExtract, caseInsensitiveReplaceAll } from './language'; +import Declaration from '../../../../language/models/declaration'; export default async function genericCodeActionsProvider(params: CodeActionParams): Promise { const uri = params.textDocument.uri; @@ -27,6 +28,12 @@ export default async function genericCodeActionsProvider(params: CodeActionParam actions.push(extractOption); } + const exportedProcedures = docs.procedures.filter(proc => proc.keyword[`EXPORT`]); + if (exportedProcedures.length > 0) { + const generateOption = getGenerateBinderSourceAction(exportedProcedures); + actions.push(generateOption); + } + const linterActions = await getLinterCodeActions(docs, document, range); if (linterActions) { actions = actions.concat(linterActions); @@ -245,4 +252,25 @@ export function getExtractProcedureAction(document: TextDocument, docs: Cache, r return newAction; } } +} + +export function getGenerateBinderSourceAction(exportedProcedures: Declaration[]): CodeAction { + const exportSymbols = exportedProcedures.map(proc => ` EXPORT SYMBOL('${proc.name.toUpperCase()}')`); + + const binderSource = [ + `STRPGMEXP PGMLVL(*CURRENT) SIGNATURE('V1')`, + ...exportSymbols, + `ENDPGMEXP` + ]; + + const newAction = CodeAction.create(`Generate binder source`, CodeActionKind.RefactorExtract); + newAction.command = { + title: 'Generate Binder Source', + command: 'vscode-rpgle.generateBinderSource', + arguments: [ + binderSource.join('\n') + ] + }; + + return newAction; } \ No newline at end of file From fe7795626bd6950830727309af087d456322d34f Mon Sep 17 00:00:00 2001 From: Sanjula Ganepola Date: Wed, 1 Oct 2025 13:26:09 -0400 Subject: [PATCH 2/2] Add view column Signed-off-by: Sanjula Ganepola --- extension/client/src/commands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extension/client/src/commands.ts b/extension/client/src/commands.ts index 4c981a27..88912d13 100644 --- a/extension/client/src/commands.ts +++ b/extension/client/src/commands.ts @@ -1,4 +1,4 @@ -import { commands, ExtensionContext, Uri, window, workspace } from "vscode"; +import { commands, ExtensionContext, Uri, ViewColumn, window, workspace } from "vscode"; import { clearTableCache, getCache } from "./requests"; import { LanguageClient } from "vscode-languageclient/node"; @@ -6,7 +6,7 @@ export function registerCommands(context: ExtensionContext, client: LanguageClie context.subscriptions.push( commands.registerCommand(`vscode-rpgle.generateBinderSource`, async (content: string) => { const document = await workspace.openTextDocument({ language: `bnd`, content: content }); - await window.showTextDocument(document); + await window.showTextDocument(document, ViewColumn.Beside); }), commands.registerCommand(`vscode-rpgle.server.reloadCache`, () => {