UNPKG

@abaplint/transpiler

Version:
58 lines 2.77 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ClassImplementationTranspiler = void 0; /* eslint-disable max-len */ const abaplint = require("@abaplint/core"); const traversal_1 = require("../traversal"); const chunk_1 = require("../chunk"); class ClassImplementationTranspiler { transpile(node, traversal) { const token = node.findFirstExpression(abaplint.Expressions.ClassName).getFirstToken(); const def = traversal.getClassDefinition(token); let ret = "class " + traversal_1.Traversal.escapeNamespace(token.getStr().toLowerCase()); if (token.getStr().toLowerCase() === "cx_root") { // special case for exceptions ret += " extends Error"; } else if (def?.getSuperClass()) { ret += " extends " + traversal_1.Traversal.escapeNamespace(def?.getSuperClass()?.toLowerCase()); } const scope = traversal.findCurrentScopeByToken(token); return new chunk_1.Chunk().append(ret + ` { static INTERNAL_TYPE = 'CLAS'; static INTERNAL_NAME = '${traversal.buildInternalName(token.getStr(), def)}'; static IMPLEMENTED_INTERFACES = [${this.findImplementedByClass(traversal, def, scope).map(e => `"` + e.toUpperCase() + `"`).join(",")}]; static ATTRIBUTES = {${Array.from(traversal.buildAttributes(def, scope)).join(",\n")}}; static METHODS = {${traversal.buildMethods(def, scope).join(",\n")}};`, node, traversal); } findImplementedInterface(traversal, def, scope) { if (def === undefined || scope === undefined) { return []; } const list = def.getImplementing().map(i => i.name.toUpperCase()); for (const i of def.getImplementing()) { const idef = traversal.findInterfaceDefinition(i.name, scope); list.push(...this.findImplementedInterface(traversal, idef, scope)); } return list; } findImplementedByClass(traversal, def, scope) { if (def === undefined || scope === undefined) { return []; } const list = def.getImplementing().map(i => i.name.toUpperCase()); for (const i of def.getImplementing()) { const idef = traversal.findInterfaceDefinition(i.name, scope); list.push(...this.findImplementedInterface(traversal, idef, scope)); } let sup = def.getSuperClass(); while (sup !== undefined) { const sdef = traversal.findClassDefinition(sup, scope); list.push(...this.findImplementedByClass(traversal, sdef, scope)); sup = sdef?.getSuperClass(); } return list; } } exports.ClassImplementationTranspiler = ClassImplementationTranspiler; //# sourceMappingURL=class_implementation.js.map