UNPKG

@abaplint/transpiler

Version:
86 lines 4.42 kB
"use strict"; 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