UNPKG

@abaplint/transpiler

Version:
80 lines 3.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TargetTranspiler = void 0; const core_1 = require("@abaplint/core"); const traversal_1 = require("../traversal"); const _1 = require("."); const chunk_1 = require("../chunk"); class TargetTranspiler { transpile(node, traversal) { const offset = []; let ret = new chunk_1.Chunk(); const children = node.getChildren(); for (let i = 0; i < children.length; i++) { const c = children[i]; const next = children[i + 1]; if (c.get() instanceof core_1.Expressions.TargetField) { const prefix = traversal.prefixAndName(c.getFirstToken()).replace("~", "$"); ret.append(traversal_1.Traversal.prefixVariable(traversal_1.Traversal.escapeNamespace(prefix)), c, traversal); } else if (c.get() instanceof core_1.Expressions.ClassName) { const name = traversal.lookupClassOrInterface(c.getFirstToken().getStr(), c.getFirstToken()); ret.append(name, 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.get() instanceof core_1.Expressions.AttributeName) { const intf = traversal_1.Traversal.escapeNamespace(traversal.isInterfaceAttribute(c.getFirstToken())); let name = traversal_1.Traversal.escapeNamespace(c.getFirstToken().getStr()).replace("~", "$").toLowerCase(); if (intf && name.startsWith(intf) === false) { name = intf + "$" + name; } ret.append(name, c, traversal); } else if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.FieldOffset) { offset.push("offset: " + new _1.FieldOffsetTranspiler().transpile(c, traversal).getCode()); } else if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.FieldLength) { const len = new _1.FieldLengthTranspiler().transpile(c, traversal).getCode(); if (len !== "*") { offset.push("length: " + len); } } else if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.TargetFieldSymbol) { ret.appendChunk(new _1.FieldSymbolTranspiler().transpile(c, traversal)); } else if (c.getFirstToken().getStr() === "-") { ret.append(".get()", 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.getFirstToken().getStr() === "=>") { ret.append(".", c, traversal); } else if (c.getFirstToken().getStr() === "->") { if (next.concatTokens() === "*") { ret.append(".dereference()", c, traversal); } else { ret.append(".get().", c, traversal); } } } if (offset.length > 0) { const pre = "new abap.OffsetLength("; const post = ", {" + offset.join(", ") + "})"; ret = new chunk_1.Chunk().appendString(pre).appendChunk(ret).appendString(post); } return ret; } } exports.TargetTranspiler = TargetTranspiler; //# sourceMappingURL=target.js.map