@abaplint/transpiler
Version:
60 lines • 2.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MethodCallTranspiler = void 0;
const core_1 = require("@abaplint/core");
const traversal_1 = require("../traversal");
const method_call_param_1 = require("./method_call_param");
const chunk_1 = require("../chunk");
class MethodCallTranspiler {
transpile(node, traversal) {
let post = "";
const nameToken = node.findDirectExpression(core_1.Expressions.MethodName)?.getFirstToken();
if (nameToken === undefined) {
throw new Error("MethodCallTranspiler, name not found");
}
const scope = traversal.findCurrentScopeByToken(nameToken);
const m = traversal.findMethodReference(nameToken, scope);
let name = nameToken.getStr().toLowerCase();
if (traversal.isBuiltinMethod(nameToken)) {
// todo: this is not correct, the method name might be shadowed
name = "abap.builtin." + name + "(";
if (name === "abap.builtin.line_exists(" || name === "abap.builtin.line_index(") {
name = `await ` + name;
name += "async () => {";
post = "}";
}
}
else if (m?.name) {
name = m.name.toLowerCase();
name = traversal_1.Traversal.escapeNamespace(name.replace("~", "$"));
if (m?.def.getVisibility() === core_1.Visibility.Private
&& m.def.isStatic() === false) {
const id = scope?.getParent()?.getParent()?.getIdentifier();
if (id?.stype === core_1.ScopeType.ClassImplementation
&& m.def.getClassName().toUpperCase() === id.sname.toUpperCase()) {
name = "#" + name;
}
else {
name = `FRIENDS_ACCESS_INSTANCE["${name}"]`;
}
}
name = name + "(";
}
else {
// todo: this should never happen?
name = traversal_1.Traversal.escapeNamespace(name.replace("~", "$"));
name = name + "(";
}
const step = node.findDirectExpression(core_1.Expressions.MethodCallParam);
if (step === undefined) {
throw new Error("MethodCallTranspiler, unexpected node");
}
const ret = new chunk_1.Chunk();
ret.append(name, nameToken, traversal);
ret.appendChunk(new method_call_param_1.MethodCallParamTranspiler(m?.def).transpile(step, traversal));
ret.appendString(post + ")");
return ret;
}
}
exports.MethodCallTranspiler = MethodCallTranspiler;
//# sourceMappingURL=method_call.js.map