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