@abaplint/transpiler
Version:
86 lines • 4.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.InterfaceTranspiler = void 0;
const abaplint = require("@abaplint/core");
const traversal_1 = require("../traversal");
const transpile_types_1 = require("../transpile_types");
const expressions_1 = require("../expressions");
const chunk_1 = require("../chunk");
class InterfaceTranspiler {
transpile(node, traversal) {
let ret = "";
let name;
const def = traversal.getInterfaceDefinition(node.getFirstToken());
for (const c of node.getChildren()) {
if (c instanceof abaplint.Nodes.StatementNode && c.get() instanceof abaplint.Statements.Interface) {
const scope = traversal.findCurrentScopeByToken(node.getFirstToken());
name = c.findDirectExpression(abaplint.Expressions.InterfaceName)?.getFirstToken().getStr().toLowerCase();
name = traversal_1.Traversal.escapeNamespace(name);
ret += `class ${name} {\n`;
ret += `static INTERNAL_TYPE = 'INTF';\n`;
ret += `static ATTRIBUTES = {${Array.from(traversal.buildAttributes(def, scope)).join(",\n")}};\n`;
ret += `static METHODS = {${traversal.buildMethods(def, scope).join(",\n")}};\n`;
}
else if (c instanceof abaplint.Nodes.StatementNode && c.get() instanceof abaplint.Statements.EndInterface) {
ret += "}\n";
ret += traversal.registerClassOrInterface(def);
}
}
ret += this.buildConstants(node.findFirstExpression(abaplint.Expressions.InterfaceName), traversal, def);
ret += this.buildTypes(def);
return new chunk_1.Chunk(ret);
}
buildTypes(idef) {
if (idef === undefined) {
return "";
}
const prefix = traversal_1.Traversal.escapeNamespace(idef.getName().toLowerCase()) + ".";
let ret = "";
for (const ty of idef.getTypeDefinitions().getAll()) {
ret += new transpile_types_1.TranspileTypes().declareStaticSkipVoid(prefix, ty.type);
}
return ret;
}
buildConstants(node, traversal, idef) {
if (node === undefined) {
return "";
}
const scope = traversal.findCurrentScopeByToken(node.getFirstToken());
const vars = scope?.getData().vars;
if (vars === undefined || Object.keys(vars).length === 0) {
return "";
}
let ret = "\n";
for (const n in vars) {
const identifier = vars[n];
if (identifier.getMeta().includes("static" /* abaplint.IdentifierMeta.Static */) === false
|| identifier.getMeta().includes("read_only" /* abaplint.IdentifierMeta.ReadOnly */) === false) {
continue;
}
else if (n.includes("~")) {
// from implemented interface
continue;
}
const interfaceName = traversal_1.Traversal.escapeNamespace(node.getFirstToken().getStr().toLowerCase());
const name = interfaceName + "." + interfaceName + "$" + n.toLowerCase();
ret += name + " = " + new transpile_types_1.TranspileTypes().toType(identifier.getType()) + ";\n";
const alias = idef?.getAliases().find(a => a.getName().toUpperCase() === n.toUpperCase());
if (alias) {
// todo: this is an evil workaround, should be fixed in abaplint instead
ret += interfaceName + "." + alias.getComponent().split("~")[0].toLowerCase() + "$" + n.toLowerCase() + " = " + name + ";\n";
}
const constantStatement = traversal.findStatementInFile(identifier.getStart());
const valExpression = constantStatement?.findFirstExpression(abaplint.Expressions.Value);
if (valExpression?.getChildren()[1].get() instanceof abaplint.Expressions.SimpleFieldChain) {
const s = new expressions_1.FieldChainTranspiler().transpile(valExpression.getChildren()[1], traversal, false).getCode();
const e = expressions_1.ConstantTranspiler.escape(s);
ret += name + ".set(" + e + ");\n";
continue;
}
ret += traversal.setValues(identifier, name);
}
return ret;
}
}
exports.InterfaceTranspiler = InterfaceTranspiler;
//# sourceMappingURL=interface.js.map