@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
66 lines • 3.79 kB
JavaScript
;
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