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