UNPKG

@abaplint/transpiler

Version:
79 lines 3.72 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CreateObjectTranspiler = void 0; const abaplint = require("@abaplint/core"); const chunk_1 = require("../chunk"); const expressions_1 = require("../expressions"); const unique_identifier_1 = require("../unique_identifier"); const types_1 = require("../types"); class CreateObjectTranspiler { transpile(node, traversal) { const target = traversal.traverse(node.findDirectExpression(abaplint.Expressions.Target)).getCode(); let para = ""; const parameters = node.findFirstExpression(abaplint.Expressions.ParameterListS); if (parameters) { para = traversal.traverse(parameters).getCode(); } let name = ""; let directGlobal = false; let dynamic = node.findDirectExpression(abaplint.Expressions.Dynamic)?.findFirstExpression(abaplint.Expressions.ConstantString); if (dynamic) { name = dynamic.getFirstToken().getStr(); // name = name.substring(1, name.length - 1); } else { dynamic = node.findDirectExpression(abaplint.Expressions.Dynamic)?.findFirstExpression(abaplint.Expressions.FieldChain); if (dynamic) { name = new expressions_1.FieldChainTranspiler(true).transpile(dynamic, traversal).getCode(); directGlobal = true; } } if (name === "") { name = this.findClassName(node, traversal); } let ret = ""; let clas = traversal.lookupClassOrInterface(name, node.getFirstToken(), directGlobal); const cx = traversal.lookupClassOrInterface("CX_SY_CREATE_OBJECT_ERROR", node.getFirstToken()); if (dynamic) { const id = unique_identifier_1.UniqueIdentifier.get(); ret += `let ${id} = abap.Classes["${traversal.buildPrefix()}"+${name}.trimEnd()];\n`; ret += `if (${id} === undefined) { ${id} = abap.Classes[${name}.trimEnd()]; }\n`; ret += `if (${id} === undefined) { throw new ${cx}; }\n`; clas = id; } ret += target + ".set(await (new " + clas + "()).constructor_(" + para + "));"; return new chunk_1.Chunk(ret); } findClassName(node, traversal) { const c = node.findDirectExpression(abaplint.Expressions.ClassName); if (c) { return c.concatTokens(); } const scope = traversal.findCurrentScopeByToken(node.getFirstToken()); if (scope === undefined) { throw new Error("CreateObjectTranspiler, unable to lookup position"); } const target = node.findDirectExpression(abaplint.Expressions.Target); if (target === undefined) { throw new Error(`CreateObjectTranspiler, target not found`); } const type = traversal.determineType(node, scope); if (type === undefined) { throw new Error(`CreateObjectTranspiler, target variable "${target?.concatTokens()}" not found in scope`); } else if (type instanceof abaplint.BasicTypes.GenericObjectReferenceType) { return "object"; } else if (!(type instanceof abaplint.BasicTypes.ObjectReferenceType)) { if (traversal.options?.unknownTypes !== types_1.UnknownTypesEnum.runtimeError) { throw new Error(`CreateObjectTranspiler, target variable "${target?.concatTokens()}" not a object reference`); } else { return "RUNTIME_ERROR"; } } return type.getIdentifierName(); } } exports.CreateObjectTranspiler = CreateObjectTranspiler; //# sourceMappingURL=create_object.js.map