@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
54 lines • 2.61 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeInputSourcesQuery = executeInputSourcesQuery;
const input_sources_query_format_1 = require("./input-sources-query-format");
const log_1 = require("../../../util/log");
const parse_1 = require("../../../slicing/criterion/parse");
const r_function_definition_1 = require("../../../r-bridge/lang-4.x/ast/model/nodes/r-function-definition");
const model_1 = require("../../../r-bridge/lang-4.x/ast/model/model");
const df_helper_1 = require("../../../dataflow/graph/df-helper");
const simple_input_classifier_1 = require("./simple-input-classifier");
const flowr_search_executor_1 = require("../../../search/flowr-search-executor");
const record_1 = require("../../../util/record");
/**
* Execute an input sources query
*/
async function executeInputSourcesQuery({ analyzer }, queries) {
const start = Date.now();
const results = {};
const nast = await analyzer.normalize();
const df = await analyzer.dataflow();
const defaultConfig = await resolveSearches(analyzer, input_sources_query_format_1.DefaultInputClassifierConfig);
for (const query of queries) {
const key = query.criterion;
if (results[key]) {
log_1.log.warn(`Duplicate key for input-sources query: ${key}, skipping...`);
}
const criterionId = parse_1.SlicingCriterion.tryParse(key, nast.idMap) ?? key;
const provenanceNode = nast.idMap.get(criterionId);
const fdef = r_function_definition_1.RFunctionDefinition.rootFunctionDefinition(provenanceNode, nast.idMap);
const provenance = df_helper_1.Dataflow.provenanceGraph(criterionId, df.graph, fdef ? model_1.RNode.collectAllIds(fdef) : undefined);
const config = { ...defaultConfig, ...(await resolveSearches(analyzer, query?.config ?? {})) };
results[key] = (0, simple_input_classifier_1.classifyInput)(criterionId, provenance, config, df.graph);
}
return {
'.meta': {
timing: Date.now() - start
},
results
};
}
async function resolveSearches(analyzer, config) {
const result = {};
for (const [key, value] of record_1.Record.entries(config)) {
if (value === undefined || Array.isArray(value)) {
result[key] = value;
}
else {
const searchResult = await (0, flowr_search_executor_1.runSearch)(value, analyzer);
result[key] = searchResult.getElements().map(element => element.node.info.id);
}
}
return result;
}
//# sourceMappingURL=input-sources-query-executor.js.map