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