UNPKG

@abaplint/transpiler

Version:
107 lines 6.44 kB
"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