UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

66 lines 3.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.executeInputSourcesQuery = executeInputSourcesQuery; 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 network_functions_1 = require("../../../linter/rules/network-functions"); const seeded_randomness_1 = require("../../../linter/rules/seeded-randomness"); const read_functions_1 = require("../dependencies-query/function-info/read-functions"); /** * 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(); 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); results[key] = (0, simple_input_classifier_1.classifyInput)(criterionId, provenance, { networkFns: query.config?.networkFns ?? network_functions_1.NETWORK_FUNCTIONS.info.defaultConfig.fns, randomFns: query.config?.randomFns ?? seeded_randomness_1.SEEDED_RANDOMNESS.info.defaultConfig.randomnessConsumers, pureFns: query.config?.pureFns ?? ['paste', 'paste0', 'parse', '+', '-', '*', '/', '^', '%%', '%/%', '&', '|', '!', '&&', '||', '<', '>', '<=', '>=', '==', '!=', ':', 'abs', 'sign', 'sqrt', 'exp', 'log', 'log10', 'log2', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'length', 'nchar', 'dim', 'nrow', 'ncol', 'c', 'list', 'data.frame', 'ifelse', 'switch', 'factor', 'as.factor', 'round', 'floor', 'ceiling', 'trunc', 'substr', 'substring', 'strsplit', 'min', 'max', 'range', 'sum', 'prod', 'mean', 'median', 'var', 'sd', 'head', 'tail', 'seq', 'rep', 'apply', 'lapply', 'sapply', 'vapply', 'tapply', 'matrix', 'array', 'substitute', 'quote', 'bquote', 'enquote', 'enexpr', 'enexprs', 'enquo', 'enquos', 'expression', 'call', 'as.call', 'as.expression', 'rownames', 'colnames', 'list.files', 'tolower', 'toupper', 'printf', '<-', '->', '=', '<<-', '->>', 'assign', 'get', '[', '[[', '$', 'length<-', 'dim<-', 'names<-', 'colnames<-', 'rownames<-', 'as.character', 'as.numeric', 'as.logical', 'as.list', 'as.data.frame', 'as.matrix', 'as.array', 'identity', 'invisible', 'return', 'force', 'missing', 'print', 'cat', 'message', 'warning', 'stop' ], readFileFns: query.config?.readFileFns ?? read_functions_1.ReadFunctions.map(f => f.name) }); } return { '.meta': { timing: Date.now() - start }, results }; } //# sourceMappingURL=input-sources-query-executor.js.map