UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

64 lines 2.08 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.executeLocationMapQuery = executeLocationMapQuery; const assert_1 = require("../../../util/assert"); const parse_1 = require("../../../slicing/criterion/parse"); const fileIdRegex = /^(?<file>.*(\.[rR]))-/; function fuzzyFindFile(node, idMap) { if (node?.info.file) { return node.info.file; } else if (node?.info.id) { const file = fileIdRegex.exec(String(node.info.id)); if (file && file.groups?.file.trim()) { return file.groups?.file.trim(); } } else if (node?.info.parent) { const parent = idMap.get(node.info.parent); if (parent) { return fuzzyFindFile(parent, idMap); } } return '@inline'; } /** * Executes a location map query * @see {@link LocationMapQuery} */ async function executeLocationMapQuery({ analyzer }, queries) { const ast = await analyzer.normalize(); const start = Date.now(); const criteriaOfInterest = new Set(queries .flatMap(q => q.ids ?? []) .map(c => parse_1.SlicingCriterion.tryParse(c, ast.idMap)) .filter(assert_1.isNotUndefined)); const locationMap = { files: {}, ids: {} }; let count = 0; const inverseMap = new Map(); await analyzer.dataflow(); // ensure all files are considered for (const file of analyzer.inspectContext().files.consideredFilesList()) { locationMap.files[count] = file; inverseMap.set(file, count); count++; } for (const [id, node] of ast.idMap.entries()) { if (node.location && (criteriaOfInterest.size === 0 || criteriaOfInterest.has(id))) { const file = fuzzyFindFile(node, ast.idMap); locationMap.ids[id] = [ inverseMap.get(file) ?? -1, node.location ]; } } return { '.meta': { timing: Date.now() - start }, map: locationMap }; } //# sourceMappingURL=location-map-query-executor.js.map