UNPKG

@abaplint/transpiler

Version:
72 lines 3.06 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FunctionModuleTranspiler = void 0; const abaplint = require("@abaplint/core"); const traversal_1 = require("../traversal"); const chunk_1 = require("../chunk"); const transpile_types_1 = require("../transpile_types"); const unique_identifier_1 = require("../unique_identifier"); class FunctionModuleTranspiler { transpile(node, traversal) { let r = ""; let name = ""; for (const c of node.getChildren()) { if (c.get() instanceof abaplint.Statements.FunctionModule && c instanceof abaplint.Nodes.StatementNode) { name = c.findDirectExpression(abaplint.Expressions.Field)?.concatTokens().toLowerCase(); if (name === undefined) { name = "FunctionModuleTranspilerNameNotFound"; } r += `async function ${traversal_1.Traversal.escapeNamespace(name)}(INPUT) {\n`; r += this.findSignature(traversal, name, c); } else if (c.get() instanceof abaplint.Statements.EndFunction) { r += "}\n"; r += `abap.FunctionModules['${name.toUpperCase()}'] = ${traversal_1.Traversal.escapeNamespace(name)};\n`; } else { r += traversal.traverse(c).getCode(); } } unique_identifier_1.UniqueIdentifier.resetIndexBackup(); return new chunk_1.Chunk(r); } ////////////////////// findSignature(traversal, name, node) { const group = traversal.getCurrentObject(); if (group === undefined) { throw "FunctionModuleTranspilerGroupNotFound"; } const module = group.getModule(name); if (module === undefined) { throw "FunctionModuleTranspilerModuleNotFound"; } const scope = traversal.findCurrentScopeByToken(node.getLastToken()); let ret = ""; for (const p of module.getParameters()) { ret += `// ${p.direction} ${p.name} ${p.type} ${p.optional}\n`; let direction = p.direction; if (direction === "importing") { direction = "exporting"; } else if (direction === "exporting") { direction = "importing"; } // note: all directions are optional let name = p.name.toLowerCase(); if (traversal.options?.keywords?.some(a => a === name)) { name += "_"; } ret += `let ${name} = INPUT.${direction}?.${name};\n`; const type = scope?.findVariable(name)?.getType(); if (type !== undefined && p.optional === true) { // todo, set DEFAULT value ret += `if (${name} === undefined) { ${name} = ${transpile_types_1.TranspileTypes.toType(type)}; }\n`; } } return ret; } } exports.FunctionModuleTranspiler = FunctionModuleTranspiler; //# sourceMappingURL=function_module.js.map