@abaplint/transpiler
Version:
40 lines • 2.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FilterBodyTranspiler = void 0;
const core_1 = require("@abaplint/core");
const chunk_1 = require("../chunk");
const type_name_or_infer_1 = require("./type_name_or_infer");
const transpile_types_1 = require("../transpile_types");
const unique_identifier_1 = require("../unique_identifier");
class FilterBodyTranspiler {
transpile(typ, body, traversal) {
if (!(typ.get() instanceof core_1.Expressions.TypeNameOrInfer)) {
throw new Error("FilterBodyTranspiler, Expected TypeNameOrInfer");
}
else if (body.findDirectTokenByText("EXCEPT")) {
return new chunk_1.Chunk(`(() => { throw new Error("FilterBodyTranspiler EXCEPT in, not supported, transpiler"); })()`);
}
const source = traversal.traverse(body.findDirectExpression(core_1.Expressions.Source)).getCode();
const type = new type_name_or_infer_1.TypeNameOrInfer().findType(typ, traversal);
const target = transpile_types_1.TranspileTypes.toType(type);
const ret = new chunk_1.Chunk();
ret.appendString("(await (async () => {\n");
let loopWhere = "";
const whereNode = body.findDirectExpression(core_1.Expressions.ComponentCond);
if (whereNode) {
const where = traversal.traverse(whereNode).getCode();
loopWhere = `, {"where": async ` + where + `}`;
}
const id = unique_identifier_1.UniqueIdentifier.get();
const loop = unique_identifier_1.UniqueIdentifier.get();
ret.appendString(`const ${id} = ${target};\n`);
ret.appendString(`for await (const ${loop} of abap.statements.loop(${source}${loopWhere})) {\n`);
ret.appendString(`abap.statements.insertInternal({"table": ${id}, "data": ${loop}});\n`);
ret.appendString(`}\n`);
ret.appendString(`return ${id};\n`);
ret.appendString("})())");
return ret;
}
}
exports.FilterBodyTranspiler = FilterBodyTranspiler;
//# sourceMappingURL=filter_body.js.map