@abaplint/transpiler
Version:
63 lines • 3.21 kB
JavaScript
;
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