@abaplint/transpiler
Version:
93 lines • 4.39 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.LoopTranspiler = void 0;
const abaplint = require("@abaplint/core");
const chunk_1 = require("../chunk");
const at_first_1 = require("./at_first");
const at_last_1 = require("./at_last");
const unique_identifier_1 = require("../unique_identifier");
const statements_1 = require("../statements");
const at_1 = require("./at");
class LoopTranspiler {
transpile(node, traversal) {
const ret = new chunk_1.Chunk();
let pre = "";
let atFirst = undefined;
let atLast = undefined;
let loopStatement = undefined;
let previous = "";
let tabix = "";
let loopTarget = "";
let hasAt = false;
for (const n of node.findDirectStructure(abaplint.Structures.Body)?.findDirectStructures(abaplint.Structures.Normal) || []) {
if (n.findDirectStructure(abaplint.Structures.At) !== undefined) {
hasAt = true;
break;
}
}
for (const c of node.getChildren()) {
if (c instanceof abaplint.Nodes.StructureNode && c.get() instanceof abaplint.Structures.Body) {
for (const b of c.getChildren()) {
for (const n of b.getChildren()) {
if (n instanceof abaplint.Nodes.StructureNode && n.get() instanceof abaplint.Structures.AtFirst) {
atFirst = new at_first_1.AtFirstTranspiler().transpile(n, traversal);
const u = unique_identifier_1.UniqueIdentifier.get();
pre = "let " + u + " = false;\n";
ret.appendString("if (" + u + " === false) {\n");
ret.appendChunk(atFirst);
ret.appendString(u + " = true;\n");
ret.appendString("}\n");
}
else if (n instanceof abaplint.Nodes.StructureNode && n.get() instanceof abaplint.Structures.AtLast) {
atLast = new at_last_1.AtLastTranspiler().transpile(n, traversal);
}
else if (n instanceof abaplint.Nodes.StructureNode && n.get() instanceof abaplint.Structures.At) {
ret.appendChunk(new at_1.AtTranspiler().transpile(n, traversal, previous, loopTarget, tabix, loopStatement));
}
else {
ret.appendChunk(traversal.traverse(n));
}
}
}
}
else if (c instanceof abaplint.Nodes.StatementNode && c.get() instanceof abaplint.Statements.Loop) {
if (hasAt === true) {
previous = unique_identifier_1.UniqueIdentifier.get();
tabix = unique_identifier_1.UniqueIdentifier.get();
ret.appendString(`let ${previous} = undefined;\n`);
ret.appendString(`let ${tabix} = undefined;\n`);
}
const loop = new statements_1.LoopTranspiler();
ret.appendChunk(loop.transpile(c, traversal));
ret.appendString("\n");
if (hasAt === true) {
ret.appendString(tabix + " = new abap.types.Integer().set(abap.builtin.sy.get().tabix.get() + 1);\n");
}
loopTarget = loop.getTarget();
loopStatement = c;
}
else if (c instanceof abaplint.Nodes.StatementNode && c.get() instanceof abaplint.Statements.EndLoop) {
if (hasAt === true) {
ret.appendString(`${previous} = ${loopTarget};\n`);
}
ret.appendChunk(traversal.traverse(c));
}
else {
ret.appendChunk(traversal.traverse(c));
}
}
const atted = new chunk_1.Chunk();
if (pre) {
atted.appendString(pre);
}
atted.appendChunk(ret);
if (atLast) {
atted.appendString("if (abap.builtin.sy.get().subrc.get() === 0) {\n");
atted.appendChunk(atLast);
atted.appendString("}\n");
}
return atted;
}
}
exports.LoopTranspiler = LoopTranspiler;
//# sourceMappingURL=loop.js.map