UNPKG

@abaplint/transpiler

Version:
67 lines 3.24 kB
"use strict"; 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.")) { 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.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 { 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