UNPKG

@abaplint/transpiler

Version:
93 lines 4.69 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FieldChainTranspiler = void 0; const core_1 = require("@abaplint/core"); const _1 = require("."); const traversal_1 = require("../traversal"); const field_symbol_1 = require("./field_symbol"); const chunk_1 = require("../chunk"); class FieldChainTranspiler { constructor(addGet = false) { this.addGet = addGet; } transpile(node, traversal, prefix = true, filename, wrongScope = false) { const ret = new chunk_1.Chunk(); const extra = []; let interfaceNameAdded = false; for (const c of node.getChildren()) { if (c.get() instanceof core_1.Expressions.SourceField || c.get() instanceof core_1.Expressions.Field) { const name = traversal.prefixAndName(c.getFirstToken(), filename).replace("~", "$"); ret.append(traversal_1.Traversal.prefixVariable(traversal_1.Traversal.escapeNamespace(name)), c, traversal); } else if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.SourceFieldSymbol) { ret.appendChunk(new field_symbol_1.FieldSymbolTranspiler().transpile(c, traversal)); } else if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.ClassName) { const name = traversal.lookupClassOrInterface(c.getFirstToken().getStr(), c.getFirstToken()); ret.append(name + ".", c, traversal); if (wrongScope === true && traversal.reg.getObject("INTF", c.getFirstToken().getStr())) { ret.append(traversal_1.Traversal.escapeNamespace(c.getFirstToken().getStr().toLocaleLowerCase()) + "$", c, traversal); interfaceNameAdded = true; } } else if (c.get() instanceof core_1.Expressions.AttributeName) { const interfaceName = traversal.isInterfaceAttribute(c.getFirstToken()); let name = c.getFirstToken().getStr().toLowerCase(); if (prefix && interfaceName && name.startsWith(interfaceName) === false && interfaceNameAdded === false) { name = traversal_1.Traversal.escapeNamespace(name).replace("~", "$"); name = traversal_1.Traversal.escapeNamespace(interfaceName) + "$" + name; } else { name = traversal_1.Traversal.escapeNamespace(name).replace("~", "$"); } ret.append(name, c, traversal); } else if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.Dereference) { ret.append(".dereference()", c, traversal); } else if (c.get() instanceof core_1.Expressions.ComponentName) { const name = c.getFirstToken().getStr().toLowerCase(); if (name.match(/^\d/) || name.includes("/")) { ret.append(`["` + name + `"]`, c, traversal); } else { ret.append(`.` + name, c, traversal); } } else if (c instanceof core_1.Nodes.TokenNode) { const str = c.getFirstToken().getStr(); if (str === "-") { ret.append(".get()", c, traversal); } else if (str === "->") { ret.append(".get().", c, traversal); } } else if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.FieldOffset) { extra.push("offset: " + new _1.FieldOffsetTranspiler().transpile(c, traversal).getCode()); this.addGetOffset = true; } else if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.FieldLength && c.concatTokens() !== "(*)") { extra.push("length: " + new _1.FieldLengthTranspiler().transpile(c, traversal).getCode()); this.addGetOffset = true; } } if (this.addGetOffset) { let foo = extra.join(", "); if (foo !== "") { foo = "{" + foo + "}"; } ret.appendString(".getOffset(" + foo + ")"); // todo, this will break } if (this.addGet) { ret.appendString(".get()"); // todo, this will break? } return ret; } } exports.FieldChainTranspiler = FieldChainTranspiler; //# sourceMappingURL=field_chain.js.map