UNPKG

@abaplint/transpiler

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