@abaplint/transpiler
Version:
107 lines • 6.44 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
let 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")) {
if (concat.startsWith("NOT ")) {
concat = concat.replace("NOT ", "");
}
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 === undefined || 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.includes(" IS INSTANCE OF ")) {
const notted = concat.startsWith("NOT ") || concat.includes(" IS NOT INSTANCE OF ");
const falsed = notted ? " === false" : "";
const expr = node.findDirectExpression(core_1.Expressions.ClassName);
const cname = expr?.concatTokens();
const lookup = traversal.lookupClassOrInterface(cname, expr?.getFirstToken());
return new chunk_1.Chunk().appendString("abap.compare.instance_of(").appendChunk(s0).appendString(`, ${lookup})` + falsed);
}
}
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(")");
}
const chain = node.findDirectExpression(core_1.Expressions.MethodCallChain);
if (chain) {
const negated = concat.startsWith("NOT ");
const name = chain.getFirstToken().getStr();
if (core_1.BuiltIn.isPredicate(name)) {
// todo, this is not completely correct if there is a method shadowing the name
const operator = negated ? 'ne' : 'eq';
return new chunk_1.Chunk().appendString(`abap.compare.${operator}(` + traversal.traverse(chain).getCode() + `, abap.builtin.abap_true)`);
}
else {
return new chunk_1.Chunk().appendString(pre + `abap.compare.initial(${traversal.traverse(chain).getCode()}) === false`);
}
}
console.dir(sources.length);
console.dir(concat);
return new chunk_1.Chunk("CompareTodo");
}
}
exports.CompareTranspiler = CompareTranspiler;
//# sourceMappingURL=compare.js.map