@abaplint/transpiler
Version:
51 lines • 2.29 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");
const feature_flags_1 = require("../feature_flags");
class MethodCallTranspiler {
transpile(node, traversal) {
const nameToken = node.findDirectExpression(core_1.Expressions.MethodName)?.getFirstToken();
if (nameToken === undefined) {
throw new Error("MethodCallTranspiler, name not found");
}
let name = nameToken.getStr().toLowerCase();
if (traversal.isBuiltinMethod(nameToken)) {
name = "abap.builtin." + name;
}
const scope = traversal.findCurrentScopeByToken(nameToken);
// it might be aliased?
const m = traversal.findMethodReference(nameToken, scope);
if (m?.name && traversal.isBuiltinMethod(nameToken) === false) {
name = m.name.toLowerCase();
}
name = traversal_1.Traversal.escapeNamespace(name.replace("~", "$"));
if (feature_flags_1.FEATURE_FLAGS.private === true
&& 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 + "(";
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(")");
return ret;
}
}
exports.MethodCallTranspiler = MethodCallTranspiler;
//# sourceMappingURL=method_call.js.map