@abaplint/transpiler
Version:
72 lines • 3.06 kB
JavaScript
;
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} = ${new transpile_types_1.TranspileTypes().toType(type)};
}\n`;
}
}
return ret;
}
}
exports.FunctionModuleTranspiler = FunctionModuleTranspiler;
//# sourceMappingURL=function_module.js.map