UNPKG

@abaplint/transpiler

Version:
125 lines 5.03 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ConstantTranspiler = void 0; const core_1 = require("@abaplint/core"); const chunk_1 = require("../chunk"); class ConstantTranspiler { constructor(addGet = false) { this.addGet = addGet; } handleInteger(int, traversal) { const concat = int.concatTokens().trim(); const parsed = Number.parseInt(concat, 10); let code = ""; if (concat.length > 18) { // its potentially larger than Number.MAX_SAFE_INTEGER // https://stackoverflow.com/questions/1379934/large-numbers-erroneously-rounded-in-javascript code = `new abap.types.Integer8().set("${concat}")`; } else if (parsed > 2147483647 || parsed < -2147483648) { code = `new abap.types.Integer8().set("${concat}")`; } else if (parsed >= -10 && parsed <= 200) { code = `abap.IntegerFactory.get(${concat})`; } else { code = `new abap.types.Integer().set(${concat})`; } if (this.addGet === true) { code += ".get()"; } return new chunk_1.Chunk().append(code, int, traversal); } transpile(node, traversal) { const int = node.findFirstExpression(core_1.Expressions.Integer); if (int) { return this.handleInteger(int, traversal); } let str = node.findDirectExpression(core_1.Expressions.ConstantString); if (str === undefined) { str = node.findDirectExpression(core_1.Expressions.TextElementString); } if (str) { let res = str.getFirstToken().getStr(); if (res.startsWith("'") && this.addGet === false) { const code = this.handleCharacter(res); return new chunk_1.Chunk().append(code, node, traversal); } else if (res.startsWith("`") && this.addGet === false) { const code = "new abap.types.String().set(" + ConstantTranspiler.escape(res) + ")"; return new chunk_1.Chunk().append(code, node, traversal); } else { if (res.startsWith("'")) { res = "'" + res.substring(1, res.length - 1).trimEnd() + "'"; } const code = ConstantTranspiler.escape(res); return new chunk_1.Chunk().append(code, node, traversal); } } const concat = node.findDirectExpression(core_1.Expressions.ConcatenatedConstant); if (concat) { const chunk = new chunk_1.Chunk().appendString("abap.operators.concat(["); let first = true; for (const child of concat.getChildren()) { const res = child.getFirstToken().getStr(); if (first === true) { first = false; } else if (res !== "&") { chunk.appendString(","); } if (res.startsWith("'") && this.addGet === false) { const code = this.handleCharacter(res); chunk.append(code, node, traversal); } else if (res.startsWith("`") && this.addGet === false) { const code = "new abap.types.String().set(" + ConstantTranspiler.escape(res) + ")"; chunk.append(code, node, traversal); } } chunk.appendString("])"); return chunk; } return new chunk_1.Chunk(`todo, Constant`); } handleCharacter(res) { const foo = res.replace(/''/g, "'"); let length = foo.length - 2; if (length <= 0) { // note: Characters cannot have length = zero, 1 is minimum length = 1; } const code = "abap.CharacterFactory.get(" + length + ", " + ConstantTranspiler.escape(res) + ")"; // const code = "new abap.types.Character(" + length + ").set(" + ConstantTranspiler.escape(res) + ")"; return code; } static escape(str) { str = str.replace(/\\/g, "\\\\"); if (str.startsWith("'")) { const reg = new RegExp(/(.+)''(.+)/g); while (reg.test(str)) { str = str.replace(reg, "$1\\'$2"); } } else if (str.startsWith("`")) { const reg = new RegExp(/(.+)``(.+)/g); while (reg.test(str)) { str = str.replace(reg, "$1\\`$2"); } str = str.replace(/\$\{/g, "\\${"); } else if (str.includes("\n") || str.includes("\r") || str.includes("\r") || str.includes("\t") || str.includes("\f") || str.includes("\v") || str.includes("\b")) { str = JSON.stringify(str); } return str; } } exports.ConstantTranspiler = ConstantTranspiler; //# sourceMappingURL=constant.js.map