UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

67 lines 3.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.processLocal = processLocal; const processor_1 = require("../../../../../processor"); const info_1 = require("../../../../../info"); const known_call_handling_1 = require("../known-call-handling"); const linker_1 = require("../../../../linker"); const common_1 = require("../common"); const unpack_argument_1 = require("../argument/unpack-argument"); const scoping_1 = require("../../../../../environments/scoping"); const identifier_1 = require("../../../../../environments/identifier"); const r_argument_1 = require("../../../../../../r-bridge/lang-4.x/ast/model/nodes/r-argument"); const built_in_proc_name_1 = require("../../../../../environments/built-in-proc-name"); /** * Processes a built-in 'local' function call. */ function processLocal(name, args, rootId, data, config) { if (args.length === 0) { return (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, origin: 'default' }).information; } const params = { [config.args.expr]: 'expr', [config.args.env]: 'env', '...': '...' }; const argMaps = (0, linker_1.pMatch)((0, common_1.convertFnArguments)(args), params); const env = (0, unpack_argument_1.unpackArg)(r_argument_1.RArgument.getWithId(args, argMaps.get('env')?.[0])); const expr = (0, unpack_argument_1.unpackArg)(r_argument_1.RArgument.getWithId(args, argMaps.get('expr')?.[0])); if (!expr) { return (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, origin: 'default' }).information; } const dfEnv = env ? (0, processor_1.processDataflowFor)(env, data) : info_1.DataflowInformation.initialize(rootId, data); if ((0, info_1.alwaysExits)(dfEnv)) { (0, common_1.patchFunctionCall)({ nextGraph: dfEnv.graph, rootId, name, data, argumentProcessResult: [dfEnv], origin: built_in_proc_name_1.BuiltInProcName.Local }); return dfEnv; } const bodyData = { ...data, environment: (0, scoping_1.pushLocalEnvironment)(data.environment) }; const dfExpr = (0, processor_1.processDataflowFor)(expr, bodyData); (0, common_1.patchFunctionCall)({ nextGraph: dfEnv.graph, rootId, name, data, argumentProcessResult: [dfExpr, dfEnv], origin: built_in_proc_name_1.BuiltInProcName.Local }); const ingoing = dfEnv.in.concat(dfExpr.in, dfEnv.unknownReferences, dfExpr.unknownReferences); ingoing.push({ nodeId: rootId, name: name.content, cds: data.cds, type: identifier_1.ReferenceType.Function }); return { hooks: dfExpr.hooks.concat(dfEnv.hooks), environment: (0, scoping_1.popLocalEnvironment)(dfExpr.environment), exitPoints: dfEnv.exitPoints.concat(dfExpr.exitPoints), graph: dfEnv.graph.mergeWith(dfExpr.graph), entryPoint: rootId, in: ingoing, out: dfExpr.out.concat(dfEnv.out), unknownReferences: [] }; } //# sourceMappingURL=built-in-local.js.map