@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
53 lines • 2.01 kB
JavaScript
;
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