UNPKG

@abaplint/transpiler

Version:
93 lines 4.39 kB
"use strict"; 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