UNPKG

@abaplint/transpiler

Version:
121 lines 6.71 kB
"use strict"; 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