UNPKG

@abaplint/transpiler

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