@abaplint/transpiler
Version:
55 lines • 2.53 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CaseTypeTranspiler = void 0;
const abaplint = require("@abaplint/core");
const unique_identifier_1 = require("../unique_identifier");
const chunk_1 = require("../chunk");
class CaseTypeTranspiler {
transpile(node, traversal) {
// does not use switch(), as it break;'s EXITs
const s = node.findDirectStatement(abaplint.Statements.CaseType)?.findDirectExpression(abaplint.Expressions.Source);
if (s === undefined) {
throw new Error("CASE TYPE, no Source found");
}
let first = true;
const u = unique_identifier_1.UniqueIdentifier.get();
const ret = new chunk_1.Chunk();
// this determines and copies the value
ret.append("let " + u + " = ", node, traversal);
ret.appendChunk(traversal.traverse(s));
ret.append(";\n", node, traversal);
for (const w of node.findDirectStructures(abaplint.Structures.WhenType)) {
for (const c of w.getChildren()) {
if (c instanceof abaplint.Nodes.StatementNode && c.get() instanceof abaplint.Statements.WhenType) {
if (first === true) {
first = false;
ret.appendString("if (");
}
else {
ret.appendString("} else if (");
}
const cname = c.findDirectExpression(abaplint.Expressions.ClassName);
const lookup = traversal.lookupClassOrInterface(cname?.concatTokens(), cname?.getFirstToken());
ret.appendString(u + ".get() instanceof " + lookup);
ret.appendString(") {\n");
ret.appendString(traversal.traverse(c.findDirectExpression(abaplint.Expressions.Target)).getCode() + ".set(" + u + ")\n");
}
else if (c instanceof abaplint.Nodes.StatementNode && c.get() instanceof abaplint.Statements.WhenOthers) {
if (first === true) {
continue;
}
ret.appendString("} else {\n");
}
else {
ret.appendChunk(traversal.traverse(c)); // Normal
}
}
}
if (first === false) {
ret.appendString("}\n");
}
return ret;
}
}
exports.CaseTypeTranspiler = CaseTypeTranspiler;
//# sourceMappingURL=case_type.js.map