@abaplint/transpiler
Version:
81 lines • 4.63 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CorrespondingBodyTranspiler = 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 component_chain_1 = require("./component_chain");
const unique_identifier_1 = require("../unique_identifier");
class CorrespondingBodyTranspiler {
transpile(typ, body, traversal) {
if (!(typ.get() instanceof core_1.Expressions.TypeNameOrInfer)) {
throw new Error("CorrespondingBodyTranspiler, Expected TypeNameOrInfer");
}
const type = new type_name_or_infer_1.TypeNameOrInfer().findType(typ, traversal);
let target = transpile_types_1.TranspileTypes.toType(type);
let source;
const isTableType = type instanceof core_1.BasicTypes.TableType;
const mapping = [];
for (const child of body.getChildren()) {
const c = child.get();
if (c instanceof core_1.Expressions.Source && child instanceof core_1.Nodes.ExpressionNode) {
source = traversal.traverse(child);
}
else if (c instanceof core_1.Expressions.CorrespondingBodyBase && child instanceof core_1.Nodes.ExpressionNode) {
source = traversal.traverse(child?.findDirectExpression(core_1.Expressions.Source));
target = `abap.statements.moveCorresponding(${source.getCode()}, ${target})`;
}
else if (c instanceof core_1.Expressions.CorrespondingBodyMapping && child instanceof core_1.Nodes.ExpressionNode) {
let mappingRow = { componentName: undefined, componentChain: undefined };
for (const cc of child.getChildren()) {
if (cc.get() instanceof core_1.Expressions.ComponentName) {
mappingRow.componentName = cc;
}
else if (cc.get() instanceof core_1.Expressions.ComponentChain) {
mappingRow.componentChain = cc;
mapping.push(mappingRow);
mappingRow = { componentName: undefined, componentChain: undefined };
}
}
}
else {
throw new Error("CorrespondingBodyTranspiler, todo, " + c.constructor.name + ", " + body.concatTokens());
}
}
const ret = new chunk_1.Chunk();
const id = unique_identifier_1.UniqueIdentifier.get();
const sourceId = unique_identifier_1.UniqueIdentifier.get();
ret.appendString("(await (async () => {\n");
ret.appendString(`const ${id} = ${target};\n`);
ret.appendString(`const ${sourceId} = ${source.getCode()};\n`);
if (isTableType) {
const rowTargetType = transpile_types_1.TranspileTypes.toType(type.getRowType());
const sourceRowId = unique_identifier_1.UniqueIdentifier.get();
const targetRowId = unique_identifier_1.UniqueIdentifier.get();
ret.appendString(`for (const ${sourceRowId} of ${sourceId}.array()) {\n`);
ret.appendString(`const ${targetRowId} = ${rowTargetType};\n`);
ret.appendString(`abap.statements.moveCorresponding(${sourceRowId}, ${targetRowId});\n`);
for (const map of mapping) {
const componentName = map.componentName.concatTokens().toLowerCase();
const chain = new component_chain_1.ComponentChainTranspiler().transpile(map.componentChain, traversal).getCode();
ret.appendString(`${targetRowId}.get().${componentName}.set(${sourceRowId}.get().${chain});\n`);
}
ret.appendString(`abap.statements.insertInternal({table: ${id}, data: ${targetRowId}});\n`);
ret.appendString("}\n");
}
else {
ret.appendString(`abap.statements.moveCorresponding(${sourceId}, ${id});\n`);
for (const map of mapping) {
const componentName = map.componentName.concatTokens().toLowerCase();
const chain = new component_chain_1.ComponentChainTranspiler().transpile(map.componentChain, traversal).getCode();
ret.appendString(`${id}.get().${componentName}.set(${sourceId}.get().${chain});\n`);
}
}
ret.appendString("return " + id + ";\n");
ret.appendString("})())");
return ret;
}
}
exports.CorrespondingBodyTranspiler = CorrespondingBodyTranspiler;
//# sourceMappingURL=corresponding_body.js.map