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