Skip to content

Commit

Permalink
feat: generate binder source from module in object browser
Browse files Browse the repository at this point in the history
  • Loading branch information
janfh committed Jan 25, 2025
1 parent 1f270d5 commit a246fdb
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 9 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2942,7 +2942,7 @@
},
{
"command": "code-for-ibmi.generateBinderSource",
"when": "view == objectBrowser && viewItem =~ /^object.(pgm|srvpgm).*/",
"when": "view == objectBrowser && viewItem =~ /^object.(module|srvpgm).*/",
"group": "1_objActions@6"
}
],
Expand Down
30 changes: 29 additions & 1 deletion src/api/IBMiContent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import tmp from 'tmp';
import util from 'util';
import * as node_ssh from "node-ssh";
import { GetMemberInfo } from './components/getMemberInfo';
import { AttrOperands, CommandResult, IBMiError, IBMiMember, IBMiObject, IFSFile, ProgramExportImportInfo, QsysPath, SpecialAuthorities } from './types';
import { AttrOperands, CommandResult, IBMiError, IBMiMember, IBMiObject, IFSFile, ProgramExportImportInfo, ModuleExport, QsysPath, SpecialAuthorities } from './types';
import { FilterType, parseFilter, singleGenericName } from './Filter';
import { default as IBMi } from './IBMi';
import { Tools } from './Tools';
Expand Down Expand Up @@ -660,6 +660,34 @@ export default class IBMiContent {
}
}

/**
* @param object IBMiObject to get module exports for
* @returns an array of ModuleExport
*/
async getModuleExports(object: IBMiObject): Promise<ModuleExport[]> {
const name: string = Tools.makeid().toUpperCase();
const results = await this.runStatements(...[
`@DSPMOD MODULE(${object.library}/${object.name}) DETAIL(*EXPORT) OUTPUT(*OUTFILE) OUTFILE(QTEMP/${name})`,
[
`select EXLBNM as MODULE_LIBRARY, EXMONM as MODULE_NAME, EXMOAT as MODULE_ATTR, EXSYNM as SYMBOL_NAME,`,
` case EXSYTY when '0' then 'PROCEDURE' when '1' then 'DATA' end as SYMBOL_TYPE, EXOPPP as ARGUMENT_OPTIMIZATION`,
` from QTEMP.${name}`
].join("\n")
]);
let exports: ModuleExport[] = [];
if (results.length) {
exports = results.map(result => ({
module_library: result.MODULE_LIBRARY,
module_name: result.MODULE_NAME,
module_attr: result.MODULE_ATTR,
symbol_name: result.SYMBOL_NAME,
symbol_type: result.SYMBOL_TYPE,
argument_optimization: result.ARGUMENT_OPTIMIZATION
} as ModuleExport));
}
return exports;
}

/**
*
* @param filter: the criterias used to list the members
Expand Down
9 changes: 9 additions & 0 deletions src/api/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,4 +192,13 @@ export interface ProgramExportImportInfo {
data_item_size: number
}

export interface ModuleExport {
module_library: string,
module_name: string,
module_attr: string,
symbol_name: string,
symbol_type: string,
argument_optimization: string,
}

export * from "./configuration/config/types";
18 changes: 11 additions & 7 deletions src/ui/views/objectBrowser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { Search } from "../../api/Search";
import { Tools } from "../../api/Tools";
import { getMemberUri } from "../../filesystems/qsys/QSysFs";
import { instance } from "../../instantiate";
import { CommandResult, DefaultOpenMode, FilteredItem, FocusOptions, IBMiMember, IBMiObject, MemberItem, OBJECT_BROWSER_MIMETYPE, ObjectFilters, ObjectItem, ProgramExportImportInfo, WithLibrary } from "../../typings";
import { CommandResult, DefaultOpenMode, FilteredItem, FocusOptions, IBMiMember, IBMiObject, MemberItem, ModuleExport, OBJECT_BROWSER_MIMETYPE, ObjectFilters, ObjectItem, ProgramExportImportInfo, WithLibrary } from "../../typings";
import { editFilter } from "../../webviews/filters";
import { VscodeTools } from "../Tools";
import { BrowserItem, BrowserItemParameters } from "../types";
Expand Down Expand Up @@ -542,17 +542,21 @@ export function initializeObjectBrowser(context: vscode.ExtensionContext) {
}),

vscode.commands.registerCommand(`code-for-ibmi.generateBinderSource`, async (node: ObjectBrowserObjectItem) => {
const contentApi = getContent();
const exports: ProgramExportImportInfo[] = (await contentApi.getProgramExportImportInfo(node.object)).filter(info => info.symbol_usage === '*PROCEXP');
let content = [
const contentApi: IBMiContent = getContent();
let exports: ProgramExportImportInfo[] | ModuleExport[] = [];
if (node.object.type === '*MODULE') {
exports = (await contentApi.getModuleExports(node.object)).filter(exp => exp.symbol_type === 'PROCEDURE');
} else {
exports = (await contentApi.getProgramExportImportInfo(node.object)).filter(info => info.symbol_usage === '*PROCEXP');
}
const content = [
`/* Binder source generated from ${node} */`,
``,
`STRPGMEXP PGMLVL(*CURRENT)`,
`STRPGMEXP PGMLVL(*CURRENT) /* SIGNATURE("") */`,
...exports.map(info => ` EXPORT SYMBOL("${info.symbol_name}")`),
`ENDPGMEXP`,
].join("\n");

const textDoc = await vscode.workspace.openTextDocument({ language: 'bnd', content });
const textDoc = await vscode.workspace.openTextDocument({ language: 'bnd', content });
await vscode.window.showTextDocument(textDoc);
}),

Expand Down

0 comments on commit a246fdb

Please sign in to comment.