CheckFunctionModule
Verify ABAP function module syntax and retrieve errors, warnings, and messages.
Instructions
Perform syntax check on an ABAP function module. Returns syntax errors, warnings, and messages.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| function_group_name | Yes | Function group name containing the function module. | |
| function_module_name | Yes | Function module name (e.g., Z_MY_FUNCTION). | |
| version | No | Version to check: 'active' or 'inactive'. Default: active. |
Implementation Reference
- High-level handler for CheckFunctionModule. Delegates to the low-level handler and normalizes the response (strips session fields, adds object_name).
export async function handleCheckFunctionModule( context: HandlerContext, args: { function_group_name: string; function_module_name: string; version?: string; }, ) { const result = await handleCheckFunctionModuleLow(context, args); return normalizeCheckResponse( result, args.function_module_name?.toUpperCase(), ); } - Low-level handler for CheckFunctionModule. Uses ADT client to perform syntax check on an ABAP function module, parses the check run response, and returns detailed results including errors/warnings.
export async function handleCheckFunctionModule( context: HandlerContext, args: CheckFunctionModuleArgs, ) { const { connection, logger } = context; try { const { function_group_name, function_module_name, version = 'active', session_id, session_state, } = args as CheckFunctionModuleArgs; if (!function_group_name || !function_module_name) { return return_error( new Error('function_group_name and function_module_name are required'), ); } const checkVersion = version && ['active', 'inactive'].includes(version.toLowerCase()) ? (version.toLowerCase() as 'active' | 'inactive') : 'active'; // Restore session state if provided if (session_id && session_state) { await restoreSessionInConnection(connection, session_id, session_state); } else { // Ensure connection is established } const functionGroupName = function_group_name.toUpperCase(); const functionModuleName = function_module_name.toUpperCase(); logger?.info( `Starting function module check: ${functionModuleName} in group ${functionGroupName} (version: ${checkVersion})`, ); try { const client = createAdtClient(connection, logger); const checkState = await client.getFunctionModule().check( { functionModuleName: functionModuleName, functionGroupName: functionGroupName, }, checkVersion, ); const response = checkState.checkResult; if (!response) { throw new Error('Function module check did not return a response'); } // Parse check results const checkResult = parseCheckRunResponse(response as AxiosResponse); // Get updated session state after check logger?.info(`✅ CheckFunctionModule completed: ${functionModuleName}`); logger?.debug( `Status: ${checkResult.status} | Errors: ${checkResult.errors.length}, Warnings: ${checkResult.warnings.length}`, ); return return_response({ data: JSON.stringify( { success: checkResult.success, function_group_name: functionGroupName, function_module_name: functionModuleName, version: checkVersion, check_result: checkResult, session_id: session_id, session_state: null, // Session state management is now handled by auth-broker, message: checkResult.success ? `Function module ${functionModuleName} has no syntax errors` : `Function module ${functionModuleName} has ${checkResult.errors.length} error(s) and ${checkResult.warnings.length} warning(s)`, }, null, 2, ), } as AxiosResponse); } catch (error: any) { logger?.error( `Error checking function module ${functionModuleName}: ${error?.message || error}`, ); let errorMessage = `Failed to check function module: ${error.message || String(error)}`; if (error.response?.status === 404) { errorMessage = `Function module ${functionModuleName} not found.`; } else if ( error.response?.data && typeof error.response.data === 'string' ) { try { const { XMLParser } = require('fast-xml-parser'); const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '@_', }); const errorData = parser.parse(error.response.data); const errorMsg = errorData['exc:exception']?.message?.['#text'] || errorData['exc:exception']?.message; if (errorMsg) { errorMessage = `SAP Error: ${errorMsg}`; } } catch (_parseError) { // Ignore parse errors } } return return_error(new Error(errorMessage)); } } catch (error: any) { return return_error(error); } } - High-level tool definition (schema) for CheckFunctionModule with input schema requiring function_group_name and function_module_name, with optional version.
export const TOOL_DEFINITION = { name: 'CheckFunctionModule', available_in: ['onprem', 'cloud', 'legacy'] as const, description: 'Perform syntax check on an ABAP function module. Returns syntax errors, warnings, and messages.', inputSchema: { type: 'object', properties: { function_group_name: { type: 'string', description: 'Function group name containing the function module.', }, function_module_name: { type: 'string', description: 'Function module name (e.g., Z_MY_FUNCTION).', }, version: { type: 'string', description: "Version to check: 'active' or 'inactive'. Default: active.", enum: ['active', 'inactive'], }, }, required: ['function_group_name', 'function_module_name'], }, } as const; - Low-level tool definition (schema) for CheckFunctionModuleLow, including additional session_id/session_state properties.
export const TOOL_DEFINITION = { name: 'CheckFunctionModuleLow', available_in: ['onprem', 'cloud', 'legacy'] as const, description: '[low-level] Perform syntax check on an ABAP function module. Returns syntax errors, warnings, and messages. Requires function group name. Can use session_id and session_state from GetSession to maintain the same session.', inputSchema: { type: 'object', properties: { function_group_name: { type: 'string', description: 'Function group name (e.g., Z_FUGR_TEST_0001)', }, function_module_name: { type: 'string', description: 'Function module name (e.g., Z_TEST_FM)', }, version: { type: 'string', description: "Version to check: 'active' (last activated) or 'inactive' (current unsaved). Default: active", enum: ['active', 'inactive'], }, session_id: { type: 'string', description: 'Session ID from GetSession. If not provided, a new session will be created.', }, session_state: { type: 'object', description: 'Session state from GetSession (cookies, csrf_token, cookie_store). Required if session_id is provided.', properties: { cookies: { type: 'string' }, csrf_token: { type: 'string' }, cookie_store: { type: 'object' }, }, }, }, required: ['function_group_name', 'function_module_name'], }, } as const; - src/lib/handlers/groups/HighLevelHandlersGroup.ts:186-189 (registration)Import of CheckFunctionModule_Tool and handleCheckFunctionModule from the high-level handler.
import { TOOL_DEFINITION as CheckFunctionModule_Tool, handleCheckFunctionModule, } from '../../../handlers/function/high/handleCheckFunctionModule'; - src/lib/handlers/groups/HighLevelHandlersGroup.ts:1010-1013 (registration)Registration of CheckFunctionModule with its tool definition and handler in the HighLevelHandlersGroup map.
{ toolDefinition: CheckFunctionModule_Tool, handler: withContext(handleCheckFunctionModule), },