@abaplint/transpiler
Version:
74 lines • 3.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MethodCallChainTranspiler = void 0;
const core_1 = require("@abaplint/core");
const traversal_1 = require("../traversal");
const chunk_1 = require("../chunk");
class MethodCallChainTranspiler {
transpile(node, traversal) {
let ret = new chunk_1.Chunk();
for (const c of node.getChildren()) {
if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.MethodCall) {
const sub = traversal.traverse(c);
if (sub.getCode().startsWith("abap.builtin.")
|| sub.getCode().startsWith("await abap.builtin.")) {
ret.appendChunk(sub);
}
else {
const t = c === node.getFirstChild() ? "this." : "";
ret = new chunk_1.Chunk()
.appendString("(await ")
.append(t, node, traversal)
.appendChunk(ret)
.appendChunk(sub)
.appendString(")");
}
}
else if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.FieldChain) {
ret.appendChunk(traversal.traverse(c));
}
else if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.NewObject) {
ret.appendChunk(traversal.traverse(c));
}
else if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.ClassName) {
ret = new chunk_1.Chunk().append(traversal.lookupClassOrInterface(c.getFirstToken().getStr(), c.getFirstToken()), c, traversal);
}
else if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.MethodName) {
const name = traversal_1.Traversal.escapeNamespace(c.getFirstToken().getStr().toLowerCase().replace("~", "$"));
ret.append(name, c, traversal);
}
else if (c instanceof core_1.Nodes.TokenNode && c.getFirstToken().getStr() === "->") {
if (ret.getCode() === "super") {
ret.append(".", c, traversal);
}
else {
ret.append(".get().", c, traversal);
}
}
else if (c instanceof core_1.Nodes.TokenNode && c.getFirstToken().getStr() === "=>") {
ret.append(".", c, traversal);
}
else if (c instanceof core_1.Nodes.TokenNode && c.getFirstToken().getStr() === "-") {
ret.append(".get()", c, traversal);
}
else if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.ComponentName) {
ret.append("." + c.concatTokens().toLowerCase(), c, traversal);
}
else if (c instanceof core_1.Nodes.ExpressionNode && c.get() instanceof core_1.Expressions.Cast) {
ret.appendChunk(traversal.traverse(c));
}
else {
ret.append("MethodCallChainTranspilerTodo$" + c.get().constructor.name, c, traversal);
}
}
const code = ret.getCode();
if (code.startsWith("(") && code.endsWith(")")) {
return new chunk_1.Chunk().append(code.substr(1, code.length - 2), node, traversal);
}
else {
return ret;
}
}
}
exports.MethodCallChainTranspiler = MethodCallChainTranspiler;
//# sourceMappingURL=method_call_chain.js.map