UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

42 lines 2.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.processSpecialBinOp = processSpecialBinOp; const known_call_handling_1 = require("../known-call-handling"); const logger_1 = require("../../../../../logger"); const edge_1 = require("../../../../../graph/edge"); const identifier_1 = require("../../../../../environments/identifier"); const built_in_proc_name_1 = require("../../../../../environments/built-in-proc-name"); /** * Process a special built-in binary operator, possibly lazily. * For example, the logical AND `&&` and OR `||` operators only evaluate their right-hand side if necessary. * Please note that this is not (directly) related to R's special binary operators like `%in%`. */ function processSpecialBinOp(name, args, rootId, data, config) { if (!config.lazy) { return (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, origin: built_in_proc_name_1.BuiltInProcName.SpecialBinOp }).information; } else if (args.length != 2) { logger_1.dataflowLogger.warn(`Logical bin-op ${identifier_1.Identifier.toString(name.content)} has something else than 2 arguments, skipping`); return (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, forceArgs: config.forceArgs, origin: 'default' }).information; } const { information, processedArguments } = (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, forceArgs: config.forceArgs, patchData: (d, i) => { if (i === 1) { return { ...d, cds: [...d.cds ?? [], { id: name.info.id, when: config.evalRhsWhen }] }; } return d; }, origin: built_in_proc_name_1.BuiltInProcName.SpecialBinOp }); for (const arg of processedArguments) { if (arg) { information.graph.addEdge(name.info.id, arg.entryPoint, edge_1.EdgeType.Reads); } // only do first if lazy if (config.lazy) { break; } } return information; } //# sourceMappingURL=built-in-special-bin-op.js.map