UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

54 lines 2.61 kB
"use strict"; 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