@abaplint/transpiler
Version:
72 lines • 4.11 kB
JavaScript
;
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