@abaplint/transpiler
Version:
97 lines • 5.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SourceTranspiler = void 0;
const core_1 = require("@abaplint/core");
const _1 = require(".");
const constant_1 = require("./constant");
const chunk_1 = require("../chunk");
class SourceTranspiler {
constructor(addGet = false) {
this.addGet = addGet;
}
transpile(node, traversal) {
let ret = new chunk_1.Chunk();
const post = new chunk_1.Chunk();
const children = node.getChildren();
for (let i = 0; i < children.length; i++) {
const c = children[i];
const last = i === children.length - 1;
if (c instanceof core_1.Nodes.ExpressionNode) {
if (c.get() instanceof core_1.Expressions.FieldChain) {
ret.appendChunk(new _1.FieldChainTranspiler(this.addGet).transpile(c, traversal));
}
else if (c.get() instanceof core_1.Expressions.Constant) {
ret.appendChunk(new constant_1.ConstantTranspiler(this.addGet).transpile(c, traversal));
}
else if (c.get() instanceof core_1.Expressions.StringTemplate) {
ret.appendChunk(traversal.traverse(c));
}
else if (c.get() instanceof core_1.Expressions.Cond) {
ret.appendChunk(traversal.traverse(c));
}
else if (c.get() instanceof core_1.Expressions.ArithOperator) {
ret = new chunk_1.Chunk().appendChunk(traversal.traverse(c)).appendString("(").appendChunk(ret).appendString(",");
post.appendString(")");
if (this.addGet) {
post.append(".get()", c, traversal);
}
}
else if (c.get() instanceof core_1.Expressions.MethodCallChain) {
ret.appendChunk(traversal.traverse(c));
const code = ret.getCode();
if (code.includes("await")) {
ret = new chunk_1.Chunk().appendString("(").appendChunk(ret).appendString(")");
}
if (this.addGet && last === true) {
ret.append(".get()", c, traversal);
}
}
else if (c.get() instanceof core_1.Expressions.Source) {
ret.appendChunk(new SourceTranspiler(this.addGet).transpile(c, traversal));
}
else if (c.get() instanceof core_1.Expressions.Arrow) {
ret = new chunk_1.Chunk().appendString("(").appendChunk(ret).appendString(").get().");
}
else if (c.get() instanceof core_1.Expressions.AttributeChain) {
ret.appendChunk(new _1.AttributeChainTranspiler().transpile(c, traversal));
}
else if (c.get() instanceof core_1.Expressions.ComponentChain) {
ret = new chunk_1.Chunk().appendString("(").appendChunk(ret).appendString(").get().");
ret.appendChunk(new _1.ComponentChainTranspiler().transpile(c, traversal));
if (this.addGet && last === true) {
ret.append(".get()", c, traversal);
}
}
else if (c.get() instanceof core_1.Expressions.Dereference) {
ret = new chunk_1.Chunk().appendString("(").appendChunk(ret).appendString(").dereference()");
}
else if (c.get() instanceof core_1.Expressions.TextElement) {
ret = new chunk_1.Chunk().appendString(`new abap.types.String().set("${c.concatTokens()}")`);
}
else {
ret.appendString("SourceUnknown-" + c.get().constructor.name);
}
}
else if (c instanceof core_1.Nodes.TokenNode && (c.getFirstToken().getStr() === "&&" || c.getFirstToken().getStr() === "&")) {
ret = new chunk_1.Chunk().appendString("abap.operators.concat(").appendChunk(ret).appendString(",");
post.appendString(")");
if (this.addGet) {
post.append(".get()", c, traversal);
}
}
else if (c instanceof core_1.Nodes.TokenNodeRegex && c.getFirstToken().getStr().toUpperCase() === "BOOLC") {
ret.append("abap.builtin.boolc(", c, traversal);
post.append(")", c, traversal);
}
else if (c instanceof core_1.Nodes.TokenNode && c.getFirstToken().getStr().toUpperCase() === "BIT") { // todo, this will not work in the general case
ret.append("abap.operators.bitnot(", c, traversal);
post.append(")", c, traversal);
}
}
ret.appendChunk(post);
// console.dir(ret.getCode());
return ret;
}
}
exports.SourceTranspiler = SourceTranspiler;
//# sourceMappingURL=source.js.map