@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
56 lines • 1.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeLocationMapQuery = executeLocationMapQuery;
const log_1 = require("../../../util/log");
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>';
}
function executeLocationMapQuery({ ast, dataflow: { graph } }, queries) {
if (queries.length !== 1) {
log_1.log.warn('Id-Map query expects only up to one query, but got', queries.length);
}
const start = Date.now();
const locationMap = {
files: {},
ids: {}
};
let count = 0;
const inverseMap = new Map();
for (const file of graph.sourced) {
locationMap.files[count] = file;
inverseMap.set(file, count);
count++;
}
for (const [id, node] of ast.idMap.entries()) {
if (node.location) {
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