@abaplint/transpiler
Version:
91 lines • 5.57 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CompareTranspiler = void 0;
const core_1 = require("@abaplint/core");
const chunk_1 = require("../chunk");
class CompareTranspiler {
transpile(node, traversal) {
// todo, this is not correct
const concat = node.concatTokens().toUpperCase();
let pre = concat.startsWith("NOT ") ? "!" : "";
const sources = node.findDirectExpressionsMulti([core_1.Expressions.Source, core_1.Expressions.SourceFieldSymbolChain, core_1.Expressions.SourceFieldSymbol]);
if (sources.length === 1) {
const s0 = traversal.traverse(sources[0]);
if (concat.startsWith("NOT ") && concat.endsWith(" IS NOT INITIAL")) {
return new chunk_1.Chunk().appendString("abap.compare.initial(").appendChunk(s0).appendString(") === true");
}
else if ((concat.startsWith("NOT ") && concat.endsWith(" IS INITIAL"))
|| concat.endsWith(" IS NOT INITIAL")) {
return new chunk_1.Chunk().appendString("abap.compare.initial(").appendChunk(s0).appendString(") === false");
}
else if (concat.endsWith(" IS INITIAL")) {
return new chunk_1.Chunk().appendString("abap.compare.initial(").appendChunk(s0).appendString(")");
}
if ((concat.startsWith("NOT ") && concat.endsWith(" IS BOUND"))
|| concat.endsWith("IS NOT BOUND")) {
return new chunk_1.Chunk().appendString("abap.compare.initial(").appendChunk(s0).appendString(")");
}
else if (concat.endsWith("IS BOUND")) {
return new chunk_1.Chunk().appendString("abap.compare.initial(").appendChunk(s0).appendString(") === false");
}
if ((concat.startsWith("NOT ") && concat.endsWith(" IS ASSIGNED"))
|| concat.endsWith("IS NOT ASSIGNED")) {
return new chunk_1.Chunk().appendString("abap.compare.assigned(").appendChunk(s0).appendString(") === false");
}
else if (concat.endsWith("IS ASSIGNED")) {
return new chunk_1.Chunk().appendString("abap.compare.assigned(").appendChunk(s0).appendString(")");
}
if (concat.endsWith(" IS SUPPLIED")) {
return new chunk_1.Chunk().appendString(pre + "INPUT && INPUT." + concat.replace(" IS SUPPLIED", "").toLowerCase());
}
else if (concat.endsWith(" IS NOT SUPPLIED")) {
return new chunk_1.Chunk().appendString(pre + "INPUT && INPUT." + concat.replace(" IS NOT SUPPLIED", "").toLowerCase() + " === undefined");
}
if (concat.endsWith(" IS REQUESTED")) {
const field = concat.replace(" IS REQUESTED", "").toLowerCase();
// yea, for function modules the naming is revereed, using "importing"
return new chunk_1.Chunk().appendString(pre + "INPUT && (INPUT." + field + " || INPUT.importing?." + field + ")");
}
else if (concat.endsWith(" IS NOT REQUESTED")) {
const field = concat.replace(" IS NOT REQUESTED", "").toLowerCase();
return new chunk_1.Chunk().appendString(pre + "INPUT && INPUT." + field + " === undefined && INPUT.importing?." + field + " === undefined");
}
if (concat.startsWith("NOT ") || concat.includes(" IS NOT INSTANCE OF ")) {
const cname = node.findDirectExpression(core_1.Expressions.ClassName)?.concatTokens();
return new chunk_1.Chunk().appendString("abap.compare.instance_of(").appendChunk(s0).appendString(`, ${cname}) === false`);
}
else if (concat.includes(" IS INSTANCE OF ")) {
const cname = node.findDirectExpression(core_1.Expressions.ClassName)?.concatTokens();
return new chunk_1.Chunk().appendString("abap.compare.instance_of(").appendChunk(s0).appendString(`, ${cname})`);
}
}
else if (sources.length === 2 && node.findDirectTokenByText("IN")) {
if (concat.search(" NOT IN ") >= 0) {
pre = pre === "!" ? "" : "!";
}
const s0 = traversal.traverse(sources[0]);
const s1 = traversal.traverse(sources[1]);
return new chunk_1.Chunk().appendString(pre + "abap.compare.in(").join([s0, s1]).appendString(")");
}
else if (sources.length === 2) {
const operator = traversal.traverse(node.findFirstExpression(core_1.Expressions.CompareOperator));
const s0 = traversal.traverse(sources[0]);
const s1 = traversal.traverse(sources[1]);
return new chunk_1.Chunk().appendString(pre + "abap.compare.").appendChunk(operator).appendString("(").join([s0, s1]).appendString(")");
}
else if (sources.length === 3 && node.findDirectTokenByText("BETWEEN")) {
if (concat.search(" NOT BETWEEN ") >= 0) {
pre = pre === "!" ? "" : "!";
}
const s0 = traversal.traverse(sources[0]);
const s1 = traversal.traverse(sources[1]);
const s2 = traversal.traverse(sources[2]);
return new chunk_1.Chunk().appendString(pre + "abap.compare.between(").join([s0, s1, s2]).appendString(")");
}
console.dir(sources.length);
console.dir(concat);
return new chunk_1.Chunk("CompareTodo");
}
}
exports.CompareTranspiler = CompareTranspiler;
//# sourceMappingURL=compare.js.map