UNPKG

@abaplint/transpiler

Version:
82 lines 4.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PerformTranspiler = void 0; /* eslint-disable max-len */ const abaplint = require("@abaplint/core"); const chunk_1 = require("../chunk"); class PerformTranspiler { transpile(node, traversal) { const formName = node.findDirectExpression(abaplint.Expressions.FormName); if (formName === undefined) { return new chunk_1.Chunk(`throw new Error("PerformTranspiler FormName not found");`); } else if (node.concatTokens().toUpperCase().includes(" IN PROGRAM ")) { // todo: throw exception if not found? const expression = node.findExpressionAfterToken("PROGRAM"); let ref = ""; if (expression?.get() instanceof abaplint.Expressions.Dynamic) { const name = expression.getChildren()[1].concatTokens() + ".get().trimEnd()"; ref = `abap.Forms['PROG-' + ${name} + '-${formName.concatTokens().toUpperCase()}']`; } else { const progName = expression?.concatTokens().toUpperCase(); ref = `abap.Forms['PROG-${progName}-${formName.concatTokens().toUpperCase()}']`; } const params = []; // hacky hack for (const t of node.findDirectExpression(abaplint.Expressions.PerformChanging)?.findDirectExpressions(abaplint.Expressions.Target) || []) { const name = t.getFirstToken().getStr(); params.push(`"${name}": ` + traversal.traverse(t).getCode()); } let call = "await " + ref + `({${params.join(",")}});`; if (node.concatTokens().toUpperCase().includes(" IF FOUND")) { call = `if (${ref} !== undefined) { ${call} }`; } return new chunk_1.Chunk(call); } else { // todo: most of this needs rewriting? let def = undefined; const scope = traversal.findCurrentScopeByToken(node.getFirstToken()); for (const r of scope?.getData().references || []) { if (r.referenceType === abaplint.ReferenceType.FormReference && r.position.getStart().equals(formName.getFirstToken().getStart()) && r.resolved instanceof abaplint.Types.FormDefinition) { def = r.resolved; } } // todo: pass by VALUE() const params = []; let index = 0; for (const t of node.findDirectExpression(abaplint.Expressions.PerformTables)?.findDirectExpressions(abaplint.Expressions.Source) || []) { const name = def?.getTablesParameters()[index].getName().toLowerCase(); if (name === undefined) { continue; } params.push(`"${name}": ` + traversal.traverse(t).getCode()); index++; } index = 0; for (const u of node.findDirectExpression(abaplint.Expressions.PerformUsing)?.findDirectExpressions(abaplint.Expressions.Source) || []) { const name = def?.getUsingParameters()[index].getName().toLowerCase(); if (name === undefined) { continue; } params.push(`"${name}": ` + traversal.traverse(u).getCode()); index++; } index = 0; for (const c of node.findDirectExpression(abaplint.Expressions.PerformChanging)?.findDirectExpressions(abaplint.Expressions.Source) || []) { const name = def?.getChangingParameters()[index].getName().toLowerCase(); if (name === undefined) { continue; } params.push(`"${name}": ` + traversal.traverse(c).getCode()); index++; } return new chunk_1.Chunk("await " + formName.concatTokens() + `({${params.join(",")}});`); } } } exports.PerformTranspiler = PerformTranspiler; //# sourceMappingURL=perform.js.map