@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
46 lines • 1.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeDfShapeQuery = executeDfShapeQuery;
const log_1 = require("../../../util/log");
const extract_cfg_1 = require("../../../control-flow/extract-cfg");
const shape_inference_1 = require("../../../abstract-interpretation/data-frame/shape-inference");
const parse_1 = require("../../../slicing/criterion/parse");
function executeDfShapeQuery({ dataflow: { graph }, ast, config }, queries) {
if (queries.length !== 1 && queries.some(query => query.criterion === undefined)) {
log_1.log.warn('The dataframe shape query expects only up to one query without slicing criterion, but got', queries.length);
queries = [{ type: 'df-shape' }];
}
const start = Date.now();
const cfg = (0, extract_cfg_1.extractCfg)(ast, config, graph);
const domains = (0, shape_inference_1.inferDataFrameShapes)(cfg, graph, ast, config);
if (queries.length === 1 && queries[0].criterion === undefined) {
return {
'.meta': {
timing: Date.now() - start
},
domains: domains
};
}
const result = new Map();
for (const query of queries) {
if (query.criterion === undefined) {
log_1.log.warn('Missing criterion in dataframe shape query');
continue;
}
else if (result.has(query.criterion)) {
log_1.log.warn('Duplicate criterion in dataframe shape query:', query.criterion);
continue;
}
const nodeId = (0, parse_1.slicingCriterionToId)(query.criterion, ast.idMap);
const node = ast.idMap.get(nodeId);
const value = (0, shape_inference_1.resolveIdToDataFrameShape)(node?.info.id, graph);
result.set(query.criterion, value);
}
return {
'.meta': {
timing: Date.now() - start
},
domains: result
};
}
//# sourceMappingURL=df-shape-query-executor.js.map