UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

53 lines 2.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.executeHigherOrderQuery = executeHigherOrderQuery; const higher_order_function_1 = require("../../../dataflow/fn/higher-order-function"); const parse_1 = require("../../../slicing/criterion/parse"); const vertex_1 = require("../../../dataflow/graph/vertex"); const df_helper_1 = require("../../../dataflow/graph/df-helper"); /** * Execute higher-order function inspection queries on the given analyzer. */ async function executeHigherOrderQuery({ analyzer }, queries) { const start = Date.now(); let filters = undefined; // filter will remain undefined if at least one of the queries wants all functions for (const q of queries) { if (q.filter === undefined) { filters = undefined; break; } else { filters ??= []; filters = filters.concat(q.filter); } } const ast = await analyzer.normalize(); const filterFor = new Set(); if (filters) { for (const f of filters) { const i = parse_1.SlicingCriterion.tryParse(f, ast.idMap); if (i !== undefined) { filterFor.add(i); } } } const graph = (await analyzer.dataflow()).graph; const fns = graph.verticesOfType(vertex_1.VertexType.FunctionDefinition) .filter(([, v]) => filterFor.size === 0 || filterFor.has(v.id)); let invertedGraph; if (filterFor.size === 0 || filterFor.size > 10) { invertedGraph = df_helper_1.Dataflow.invertGraph(graph, analyzer.inspectContext().env.makeCleanEnv()); } const result = {}; for (const [id] of fns) { result[id] = (0, higher_order_function_1.isFunctionHigherOrder)(id, graph, analyzer.inspectContext(), invertedGraph); } return { '.meta': { timing: Date.now() - start }, higherOrder: result }; } //# sourceMappingURL=inspect-higher-order-query-executor.js.map