UNPKG

@abaplint/transpiler

Version:
63 lines 3.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SetHandlerTranspiler = void 0; const abaplint = require("@abaplint/core"); const chunk_1 = require("../chunk"); const expressions_1 = require("../expressions"); class SetHandlerTranspiler { transpile(node, traversal) { const methods = []; let eventClass = undefined; let eventName = undefined; for (const m of node.findDirectExpressions(abaplint.Expressions.MethodSource)) { const msource = new expressions_1.MethodSourceTranspiler("", true).transpile(m, traversal).getCode().replace("await ", ""); // fallback to private method, // msource = "(" + msource + " || " + msource.replace(/(\w+)$/, "#$1") + ")"; methods.push(msource + ".bind(this)"); if (eventClass === undefined) { const nameToken = m.getLastToken(); const scope = traversal.findCurrentScopeByToken(nameToken); const method = traversal.findMethodReference(nameToken, scope); if (method?.def.isEventHandler() !== true) { throw new Error(`SetHandlerTranspiler: Method "${nameToken.getStr()}" is not an event handler`); } eventName = method.def.getEventName(); eventClass = this.findEventClass(method.def, traversal, scope); } } let f = undefined; const forExpression = node.findExpressionAfterToken("FOR"); if (forExpression instanceof abaplint.Expressions.Source) { f = new expressions_1.SourceTranspiler().transpile(forExpression, traversal).getCode(); } else { f = `"ALL"`; } let activation = ""; const activationExpression = node.findExpressionAfterToken("ACTIVATION"); if (activationExpression) { activation = ", " + new expressions_1.SourceTranspiler().transpile(activationExpression, traversal).getCode(); } return new chunk_1.Chunk().append(`abap.statements.setHandler({EVENT_NAME: "${eventName}", EVENT_CLASS: "${eventClass}"}, [${methods.join(",")}], ${f}${activation});`, node, traversal); } /////////////////////////////////////////////////////////////////////// findEventClass(mdef, traversal, scope) { let def = traversal.findClassDefinition(mdef.getEventClass(), scope); if (def === undefined) { def = traversal.findInterfaceDefinition(mdef.getEventClass(), scope); } // look through super classes while (def?.getSuperClass() !== undefined) { if (def.getEvents().find(e => e.getName().toUpperCase() === mdef.getEventName()?.toUpperCase())) { break; } def = traversal.findClassDefinition(def.getSuperClass(), scope); } if (def === undefined) { throw new Error(`SetHandlerTranspiler: findEventClass, class or interface "${mdef.getEventClass()}" not found`); } return traversal.buildInternalName(def.getName(), def); } } exports.SetHandlerTranspiler = SetHandlerTranspiler; //# sourceMappingURL=set_handler.js.map