UNPKG

@abaplint/transpiler

Version:
72 lines 4.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ReduceBodyTranspiler = void 0; const core_1 = require("@abaplint/core"); const chunk_1 = require("../chunk"); const transpile_types_1 = require("../transpile_types"); const target_1 = require("./target"); class ReduceBodyTranspiler { transpile(typ, body, traversal) { if (!(typ.get() instanceof core_1.Expressions.TypeNameOrInfer)) { throw new Error("ReduceBodyTranspiler, Expected TypeNameOrInfer"); } else if (body.findDirectExpression(core_1.Expressions.Let) !== undefined) { return new chunk_1.Chunk(`(() => { throw new Error("ReduceBodyTranspiler LET, not supported, transpiler"); })()`); } const forExpressions = body.findDirectExpressions(core_1.Expressions.For); const forExpression = forExpressions[0]; if (forExpressions.length === 0) { throw new Error("ReduceBodyTranspiler, expected FOR"); } else if (forExpressions.length > 1) { throw new Error("ReduceBodyTranspiler, multiple FOR not supported, " + body.concatTokens()); } else if (["THEN", "UNTIL", "WHILE", "FROM", "TO", "GROUPS"].some(token => forExpressions[0].findDirectTokenByText(token))) { throw new Error("ValueBody FOR todo, " + body.concatTokens()); } const loopExpression = forExpression.findDirectExpression(core_1.Expressions.InlineLoopDefinition); const loopSource = traversal.traverse(loopExpression?.findDirectExpression(core_1.Expressions.Source)).getCode(); const loopVariable = traversal.traverse(loopExpression?.findDirectExpression(core_1.Expressions.TargetField) || loopExpression?.findDirectExpression(core_1.Expressions.TargetFieldSymbol)).getCode(); // const type = new TypeNameOrInfer().findType(typ, traversal); // const target = TranspileTypes.toType(type); const ret = new chunk_1.Chunk(); ret.appendString("(await (async () => {\n"); let loopWhere = ""; const whereNode = forExpression?.findDirectExpression(core_1.Expressions.ComponentCond); if (whereNode) { const where = traversal.traverse(whereNode).getCode(); loopWhere = `, {"where": async ` + where + `}`; } /* const returnId = UniqueIdentifier.get(); ret.appendString(`const ${returnId} = ${target};\n`); */ let returnField = ""; for (const init of body.findDirectExpressions(core_1.Expressions.InlineFieldDefinition)) { const fieldName = init.findDirectExpression(core_1.Expressions.Field).concatTokens().toLowerCase(); returnField = fieldName; const scope = traversal.findCurrentScopeByToken(init.getFirstToken()); const variable = scope?.findVariable(fieldName); if (variable === undefined) { throw new Error(`ReduceBodyTranspiler: variable ${fieldName} not found`); } ret.appendString(transpile_types_1.TranspileTypes.declare(variable) + `\n`); } ret.appendString(`for await (const ${loopVariable} of abap.statements.loop(${loopSource}${loopWhere})) {\n`); for (const nextChild of body.findDirectExpression(core_1.Expressions.ReduceNext)?.getChildren() || []) { if (nextChild.get() instanceof core_1.Expressions.SimpleTarget && nextChild instanceof core_1.Nodes.ExpressionNode) { ret.appendString(new target_1.TargetTranspiler().transpile(nextChild, traversal).getCode() + ".set("); } else if (nextChild.get() instanceof core_1.Expressions.Source && nextChild instanceof core_1.Nodes.ExpressionNode) { ret.appendString(traversal.traverse(nextChild).getCode() + ");\n"); } } ret.appendString(`}\n`); ret.appendString(`return ${returnField};\n`); ret.appendString("})())"); return ret; } } exports.ReduceBodyTranspiler = ReduceBodyTranspiler; //# sourceMappingURL=reduce_body.js.map