@abaplint/transpiler
Version:
121 lines • 6.71 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MethodSourceTranspiler = void 0;
/* eslint-disable max-len */
const core_1 = require("@abaplint/core");
const traversal_1 = require("../traversal");
const chunk_1 = require("../chunk");
const _1 = require(".");
class MethodSourceTranspiler {
constructor(prepend) {
this.prepend = (prepend || "") + "await ";
}
transpile(node, traversal) {
const ret = new chunk_1.Chunk();
const children = node.getChildren();
let call = "";
for (let i = 0; i < children.length; i++) {
const child = children[i];
const nextChild = children[i + 1];
if (child.get() instanceof core_1.Expressions.ClassName) {
call += traversal.lookupClassOrInterface(child.concatTokens(), child.getFirstToken());
}
else if (child.get() instanceof core_1.Expressions.Dynamic && nextChild?.concatTokens() === "=>") {
const second = child.getChildren()[1];
const illegalClass = traversal.lookupClassOrInterface("'CX_SY_DYN_CALL_ILLEGAL_CLASS'", child.getFirstToken(), true);
const illegalMethod = traversal.lookupClassOrInterface("'CX_SY_DYN_CALL_ILLEGAL_METHOD'", child.getFirstToken(), true);
if (second.get() instanceof core_1.Expressions.FieldChain && second instanceof core_1.Nodes.ExpressionNode) {
const t = new _1.FieldChainTranspiler(true).transpile(second, traversal).getCode();
call = traversal.lookupClassOrInterface(t, child.getFirstToken(), true);
ret.appendString(`if (${call} === undefined) { if (${illegalClass} === undefined) { throw "CX_SY_DYN_CALL_ILLEGAL_CLASS not found"; } else {throw new ${illegalClass}(); } }\n`);
}
else if (second.get() instanceof core_1.Expressions.Constant) {
call = traversal.lookupClassOrInterface(second.getFirstToken().getStr(), child.getFirstToken(), true);
ret.appendString(`if (${call} === undefined) { if (${illegalClass} === undefined) { throw "CX_SY_DYN_CALL_ILLEGAL_CLASS not found"; } else {throw new ${illegalClass}(); } }\n`);
const name = children[i + 2];
if (name.get() instanceof core_1.Expressions.AttributeName) {
const suffix = "." + name.concatTokens().toLowerCase().replace("~", "$");
ret.appendString(`if (${call + suffix} === undefined && ${illegalMethod} === undefined) { throw "CX_SY_DYN_CALL_ILLEGAL_METHOD not found"; }\n`);
ret.appendString(`if (${call + suffix} === undefined) { throw new ${illegalMethod}(); }\n`);
}
}
else {
ret.appendString("MethodSourceTranspiler-Unexpected");
}
}
else if (child.get() instanceof core_1.Expressions.Dynamic) {
const second = child.getChildren()[1];
// const lookupException = traversal.lookupClassOrInterface("'CX_SY_DYN_CALL_ILLEGAL_METHOD'", child.getFirstToken(), true);
if (second.get() instanceof core_1.Expressions.FieldChain && second instanceof core_1.Nodes.ExpressionNode) {
if (call.endsWith(".")) {
call = call.substring(0, call.length - 1);
}
if (call === "") {
call = "this";
}
call = `abap.dynamicCallLookup(${call}, ${traversal.traverse(second).getCode()})`;
}
else if (second.get() instanceof core_1.Expressions.Constant) {
if (call.endsWith(".")) {
call = call.substring(0, call.length - 1);
}
if (call === "") {
call = "this";
}
const methodName = second.getFirstToken().getStr().replace(/[\'\`]/g, "").toLowerCase().replace("~", "$").trimEnd();
call = `abap.dynamicCallLookup(${call}, "${methodName}")`;
}
else {
ret.appendString("MethodSourceTranspiler-Unexpected");
}
/*
ret.appendString(`if (${call} === undefined && ${lookupException} === undefined) { throw "CX_SY_DYN_CALL_ILLEGAL_METHOD not found"; }\n`);
ret.appendString(`if (${call} === undefined) { throw new ${lookupException}(); }\n`);
*/
}
else if (child.get() instanceof core_1.Expressions.MethodName
|| child.get() instanceof core_1.Expressions.AttributeName) {
if (i === 0) {
this.prepend += "this.";
}
const nameToken = child.getFirstToken();
const m = traversal.findMethodReference(nameToken, traversal.findCurrentScopeByToken(nameToken));
if (m) {
call += traversal_1.Traversal.escapeNamespace(m.name.toLowerCase().replace("~", "$"));
}
else {
const methodName = traversal_1.Traversal.escapeNamespace(child.concatTokens().toLowerCase().replace("~", "$"));
call += methodName;
}
}
else if (child.concatTokens() === "=>") {
call += ".";
}
else if (child.concatTokens() === "->") {
if (ret.getCode() !== "super") {
call += ".get()";
}
if (!(nextChild.get() instanceof core_1.Expressions.Dynamic)) {
call += ".";
}
}
else if (child.get() instanceof core_1.Expressions.FieldChain
|| child.get() instanceof core_1.Expressions.SourceField) {
const nameToken = child.getFirstToken();
const m = traversal.findMethodReference(nameToken, traversal.findCurrentScopeByToken(nameToken));
if (i === 0 && m) {
this.prepend += "this.";
}
call += traversal.traverse(child).getCode();
}
else {
ret.appendString("MethodSourceTranspiler-" + child.get().constructor.name + "-todo");
}
}
ret.appendString(this.prepend);
ret.appendString(call);
return ret;
}
}
exports.MethodSourceTranspiler = MethodSourceTranspiler;
//# sourceMappingURL=method_source.js.map