@abaplint/transpiler
Version:
80 lines • 3.92 kB
JavaScript
;
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