@abaplint/transpiler
Version:
89 lines • 4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MoveTranspiler = void 0;
const abaplint = require("@abaplint/core");
const chunk_1 = require("../chunk");
class MoveTranspiler {
transpile(node, traversal) {
const sourceExpression = node.findDirectExpression(abaplint.Expressions.Source);
const targets = [];
const targetExpressions = node.findDirectExpressions(abaplint.Expressions.Target);
for (const t of targetExpressions) {
targets.push(traversal.traverse(t));
}
const ret = new chunk_1.Chunk();
if (targetExpressions.length === 1
&& sourceExpression?.getChildren().length === 1
&& sourceExpression.findDirectExpression(abaplint.Expressions.StringTemplate)
&& sourceExpression.concatTokens().toUpperCase().endsWith(" ALPHA = IN }|")
&& sourceExpression.concatTokens().toUpperCase().startsWith("|{")) {
const target = targets[0].getCode();
const tSource = traversal.traverse(sourceExpression.findFirstExpression(abaplint.Expressions.StringTemplateSource)?.findDirectExpression(abaplint.Expressions.Source));
ret.appendString(target + `.set(abap.alphaIn(${tSource.getCode()}, ${target}, ${target}));`);
return ret;
}
let source = traversal.traverse(sourceExpression);
const second = node.getChildren()[1]?.concatTokens();
switch (second) {
case "?=":
ret.appendString("await abap.statements.cast(")
.appendChunk(targets[0])
.appendString(", ")
.appendChunk(source)
.append(");", node.getLastToken(), traversal);
break;
case "+":
ret.appendChunk(targets[0])
.appendString(".set(abap.operators.add(")
.appendChunk(targets[0])
.appendString(", ")
.appendChunk(source)
.append("));", node.getLastToken(), traversal);
break;
case "-":
ret.appendChunk(targets[0])
.appendString(".set(abap.operators.minus(")
.appendChunk(targets[0])
.appendString(", ")
.appendChunk(source)
.append("));", node.getLastToken(), traversal);
break;
case "/=":
ret.appendChunk(targets[0])
.appendString(".set(abap.operators.divide(")
.appendChunk(targets[0])
.appendString(", ")
.appendChunk(source)
.append("));", node.getLastToken(), traversal);
break;
case "*=":
ret.appendChunk(targets[0])
.appendString(".set(abap.operators.multiply(")
.appendChunk(targets[0])
.appendString(", ")
.appendChunk(source)
.append("));", node.getLastToken(), traversal);
break;
case "&&=":
ret.appendChunk(targets[0])
.appendString(".set(abap.operators.concat(")
.appendChunk(targets[0])
.appendString(", ")
.appendChunk(source)
.append("));", node.getLastToken(), traversal);
break;
default:
for (const target of targets.reverse()) {
ret.appendChunk(target)
.appendString(".set(")
.appendChunk(source)
.append(");", node.getLastToken(), traversal);
source = target;
}
break;
}
return ret;
}
}
exports.MoveTranspiler = MoveTranspiler;
//# sourceMappingURL=move.js.map