@eagleoutice/flowr-dev
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
191 lines • 9.93 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DependenciesQueryDefinition = exports.WriteFunctions = exports.ReadFunctions = exports.SourceFunctions = exports.LibraryFunctions = void 0;
const ansi_1 = require("../../../util/ansi");
const time_1 = require("../../../util/time");
const joi_1 = __importDefault(require("joi"));
const dependencies_query_executor_1 = require("./dependencies-query-executor");
// these lists are originally based on https://github.com/duncantl/CodeDepends/blob/7fd96dfee16b252e5f642c77a7ababf48e9326f8/R/codeTypes.R
exports.LibraryFunctions = [
{ name: 'library', argIdx: 0, argName: 'package' },
{ name: 'require', argIdx: 0, argName: 'package' },
{ name: 'loadNamespace', argIdx: 0, argName: 'package' },
{ name: 'attachNamespace', argIdx: 0, argName: 'ns' },
{ name: 'attach', argIdx: 0, argName: 'what' },
{ name: 'groundhog.library', argIdx: 0, argName: 'pkg' },
{ name: 'p_load', argIdx: 'unnamed' }, // pacman
{ name: 'p_load_gh', argIdx: 'unnamed' }, // pacman
{ name: 'from_import', argIdx: 0, argName: 'package' }, // easypackages
{ name: 'libraries', argIdx: 'unnamed' }, // easypackages
{ name: 'shelf', argIdx: 'unnamed' } // librarian
];
exports.SourceFunctions = [
{ name: 'source', argIdx: 0, argName: 'file' },
{ name: 'sys.source', argIdx: 0, argName: 'file' }
];
exports.ReadFunctions = [
{ name: 'read.table', argIdx: 0, argName: 'file' },
{ name: 'read.csv', argIdx: 0, argName: 'file' },
{ name: 'read.csv2', argIdx: 0, argName: 'file' },
{ name: 'read.delim', argIdx: 0, argName: 'file' },
{ name: 'read.dcf', argIdx: 0, argName: 'file' },
{ name: 'scan', argIdx: 0, argName: 'file' },
{ name: 'read.fwf', argIdx: 0, argName: 'file' },
{ name: 'file', argIdx: 1, argName: 'open' },
{ name: 'url', argIdx: 1, argName: 'open' },
{ name: 'load', argIdx: 0, argName: 'file' },
{ name: 'gzfile', argIdx: 1, argName: 'open' },
{ name: 'bzfile', argIdx: 1, argName: 'open' },
{ name: 'download.file', argIdx: 0, argName: 'url' },
{ name: 'pipe', argIdx: 1, argName: 'open' },
{ name: 'fifo', argIdx: 1, argName: 'open' },
{ name: 'unz', argIdx: 1, argName: 'open' },
{ name: 'matrix', argIdx: 0, argName: 'data' },
{ name: 'readRDS', argIdx: 0, argName: 'file' },
{ name: 'readLines', argIdx: 0, argName: 'con' },
{ name: 'readRenviron', argIdx: 0, argName: 'path' },
// readr
{ name: 'read_csv', argIdx: 0, argName: 'file' },
{ name: 'read_csv2', argIdx: 0, argName: 'file' },
{ name: 'read_lines', argIdx: 0, argName: 'file' },
{ name: 'read_delim', argIdx: 0, argName: 'file' },
{ name: 'read_dsv', argIdx: 0, argName: 'file' },
{ name: 'read_fwf', argIdx: 0, argName: 'file' },
{ name: 'read_tsv', argIdx: 0, argName: 'file' },
{ name: 'read_table', argIdx: 0, argName: 'file' },
{ name: 'read_log', argIdx: 0, argName: 'file' },
{ name: 'read_lines', argIdx: 0, argName: 'file' },
{ name: 'read_lines_chunked', argIdx: 0, argName: 'file' },
// xlsx
{ name: 'read.xlsx', argIdx: 0, argName: 'file' },
{ name: 'read.xlsx2', argIdx: 0, argName: 'file' },
// data.table
{ name: 'fread', argIdx: 0, argName: 'file' },
// haven
{ name: 'read_sas', argIdx: 0, argName: 'file' },
{ name: 'read_sav', argIdx: 0, argName: 'file' },
{ name: 'read_por', argIdx: 0, argName: 'file' },
{ name: 'read_dta', argIdx: 0, argName: 'file' },
{ name: 'read_xpt', argIdx: 0, argName: 'file' },
// feather
{ name: 'read_feather', argIdx: 0, argName: 'file' },
// foreign
{ name: 'read.arff', argIdx: 0, argName: 'file' },
{ name: 'read.dbf', argIdx: 0, argName: 'file' },
{ name: 'read.dta', argIdx: 0, argName: 'file' },
{ name: 'read.epiinfo', argIdx: 0, argName: 'file' },
{ name: 'read.mtp', argIdx: 0, argName: 'file' },
{ name: 'read.octave', argIdx: 0, argName: 'file' },
{ name: 'read.spss', argIdx: 0, argName: 'file' },
{ name: 'read.ssd', argIdx: 0, argName: 'file' },
{ name: 'read.systat', argIdx: 0, argName: 'file' },
{ name: 'read.xport', argIdx: 0, argName: 'file' },
// car
{ name: 'Import', argIdx: 0, argName: 'file' },
];
exports.WriteFunctions = [
{ name: 'save', argIdx: 0, argName: '...' },
{ name: 'save.image', argIdx: 0, argName: 'file' },
{ name: 'write', argIdx: 1, argName: 'file' },
{ name: 'dput', argIdx: 1, argName: 'file' },
{ name: 'dump', argIdx: 1, argName: 'file' },
{ name: 'write.table', argIdx: 1, argName: 'file' },
{ name: 'write.csv', argIdx: 1, argName: 'file' },
{ name: 'saveRDS', argIdx: 1, argName: 'file' },
// write functions that don't have argIndex are assumed to write to stdout
{ name: 'print', linkTo: 'sink' },
{ name: 'cat', linkTo: 'sink', argIdx: 1, argName: 'file' },
{ name: 'message', linkTo: 'sink' },
{ name: 'warning', linkTo: 'sink' },
// readr
{ name: 'write_csv', argIdx: 1, argName: 'file' },
{ name: 'write_csv2', argIdx: 1, argName: 'file' },
{ name: 'write_delim', argIdx: 1, argName: 'file' },
{ name: 'write_dsv', argIdx: 1, argName: 'file' },
{ name: 'write_fwf', argIdx: 1, argName: 'file' },
{ name: 'write_tsv', argIdx: 1, argName: 'file' },
{ name: 'write_table', argIdx: 1, argName: 'file' },
{ name: 'write_log', argIdx: 1, argName: 'file' },
// heaven
{ name: 'write_sas', argIdx: 1, argName: 'file' },
{ name: 'write_sav', argIdx: 1, argName: 'file' },
{ name: 'write_por', argIdx: 1, argName: 'file' },
{ name: 'write_dta', argIdx: 1, argName: 'file' },
{ name: 'write_xpt', argIdx: 1, argName: 'file' },
// feather
{ name: 'write_feather', argIdx: 1, argName: 'file' },
// foreign
{ name: 'write.arff', argIdx: 1, argName: 'file' },
{ name: 'write.dbf', argIdx: 1, argName: 'file' },
{ name: 'write.dta', argIdx: 1, argName: 'file' },
{ name: 'write.foreign', argIdx: 1, argName: 'file' },
// xlsx
{ name: 'write.xlsx', argIdx: 1, argName: 'file' },
{ name: 'write.xlsx2', argIdx: 1, argName: 'file' },
// graphics
{ name: 'pdf', argIdx: 0, argName: 'file' },
{ name: 'jpeg', argIdx: 0, argName: 'file' },
{ name: 'png', argIdx: 0, argName: 'file' },
{ name: 'windows', argIdx: 0, argName: 'file' },
{ name: 'postscript', argIdx: 0, argName: 'file' },
{ name: 'xfix', argIdx: 0, argName: 'file' },
{ name: 'bitmap', argIdx: 0, argName: 'file' },
{ name: 'pictex', argIdx: 0, argName: 'file' },
{ name: 'cairo_pdf', argIdx: 0, argName: 'file' },
{ name: 'svg', argIdx: 0, argName: 'file' },
{ name: 'bmp', argIdx: 0, argName: 'file' },
{ name: 'tiff', argIdx: 0, argName: 'file' },
{ name: 'X11', argIdx: 0, argName: 'file' },
{ name: 'quartz', argIdx: 0, argName: 'file' },
// car
{ name: 'Export', argIdx: 0, argName: 'file' },
];
function printResultSection(title, infos, result, sectionSpecifics) {
if (infos.length <= 0) {
return;
}
result.push(` ╰ ${title}`);
const grouped = infos.reduce(function (groups, i) {
const array = groups.get(i.functionName);
if (array) {
array.push(i);
}
else {
groups.set(i.functionName, [i]);
}
return groups;
}, new Map());
for (const [functionName, infos] of grouped) {
result.push(` ╰ \`${functionName}\``);
result.push(infos.map(i => ` ╰ Node Id: ${i.nodeId}, ${sectionSpecifics(i)}`).join('\n'));
}
}
const functionInfoSchema = joi_1.default.array().items(joi_1.default.object({
name: joi_1.default.string().required().description('The name of the library function.'),
argIdx: joi_1.default.number().optional().description('The index of the argument that contains the library name.'),
argName: joi_1.default.string().optional().description('The name of the argument that contains the library name.'),
})).optional();
exports.DependenciesQueryDefinition = {
executor: dependencies_query_executor_1.executeDependenciesQuery,
asciiSummarizer: (formatter, _processed, queryResults, result) => {
const out = queryResults;
result.push(`Query: ${(0, ansi_1.bold)('dependencies', formatter)} (${(0, time_1.printAsMs)(out['.meta'].timing, 0)})`);
printResultSection('Libraries', out.libraries, result, l => `\`${l.libraryName}\``);
printResultSection('Sourced Files', out.sourcedFiles, result, s => `\`${s.file}\``);
printResultSection('Read Data', out.readData, result, r => `\`${r.source}\``);
printResultSection('Written Data', out.writtenData, result, w => `\`${w.destination}\``);
return true;
},
schema: joi_1.default.object({
type: joi_1.default.string().valid('dependencies').required().description('The type of the query.'),
ignoreDefaultFunctions: joi_1.default.boolean().optional().description('Should the set of functions that are detected by default be ignored/skipped?'),
libraryFunctions: functionInfoSchema.description('The set of library functions to search for.'),
sourceFunctions: functionInfoSchema.description('The set of source functions to search for.'),
readFunctions: functionInfoSchema.description('The set of data reading functions to search for.'),
writeFunctions: functionInfoSchema.description('The set of data writing functions to search for.'),
}).description('The dependencies query retrieves and returns the set of all dependencies in the dataflow graph, which includes libraries, sourced files, read data, and written data.')
};
//# sourceMappingURL=dependencies-query-format.js.map