@abaplint/transpiler
Version:
112 lines • 5.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TargetTranspiler = void 0;
const core_1 = require("@abaplint/core");
const abaplint = 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();
let context = undefined;
const scope = traversal.findCurrentScopeByToken(node.getFirstToken());
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);
context = scope?.findVariable(c.getFirstToken().getStr())?.getType();
}
else if (c.get() instanceof core_1.Expressions.TableExpression && c instanceof core_1.Nodes.ExpressionNode) {
ret = new _1.TableExpressionTranspiler().transpile(c, traversal, ret);
}
else if (c.get() instanceof core_1.Expressions.InlineData && c instanceof core_1.Nodes.ExpressionNode) {
const targetField = c.findDirectExpression(core_1.Expressions.TargetField);
if (targetField === undefined) {
throw new Error("TargetTranspiler: InlineData Target field not found");
}
ret.append(traversal_1.Traversal.prefixVariable(traversal_1.Traversal.escapeNamespace(targetField?.concatTokens())), c, traversal);
context = scope?.findVariable(targetField.getFirstToken().getStr())?.getType();
}
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) {
let prefix = "";
let postfix = "";
if (context instanceof abaplint.BasicTypes.ObjectReferenceType) {
const cdef = traversal.findClassDefinition(context.getIdentifierName(), scope);
const attr = cdef?.getAttributes().findByName(c.getFirstToken().getStr());
if (attr?.getVisibility() === abaplint.Visibility.Private) {
const id = scope?.getParent()?.getParent()?.getIdentifier();
if (id?.stype === abaplint.ScopeType.ClassImplementation
&& cdef?.getName().toUpperCase() === id.sname.toUpperCase()) {
prefix = "#";
}
else {
prefix = `FRIENDS_ACCESS_INSTANCE["`;
postfix = `"]`;
}
}
}
const intf = traversal_1.Traversal.escapeNamespace(traversal.isInterfaceAttribute(c.getFirstToken()));
let name = prefix + traversal_1.Traversal.escapeNamespace(c.getFirstToken().getStr()).replace("~", "$").toLowerCase() + postfix;
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