UNPKG

@eagleoutice/flowr-dev

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

48 lines 1.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.QueryFunctionFilter = void 0; const parse_1 = require("../slicing/criterion/parse"); const vertex_1 = require("../dataflow/graph/vertex"); /** * Resolves the function filter shared by the inspection queries (`inspect-*`). */ exports.QueryFunctionFilter = { name: 'QueryFunctionFilter', /** The ids the given queries restrict themselves to; empty if at least one query wants all functions. */ async criteria(queries, analyzer) { 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); } } } return filterFor; }, /** The call graph together with the functions the given queries want to inspect. */ async inCallGraph(queries, analyzer, onlyDefinitions = true) { const filterFor = await exports.QueryFunctionFilter.criteria(queries, analyzer); const cg = await analyzer.callGraph(); let fns = (onlyDefinitions || filterFor.size === 0 ? cg.verticesOfType(vertex_1.VertexType.FunctionDefinition) : cg.vertices(true)); if (filterFor.size > 0) { fns = fns.filter(([id]) => filterFor.has(id)); } return { cg, fns }; } }; //# sourceMappingURL=query-function-filter.js.map