@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
62 lines • 3.08 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProvenanceQueryDefinition = void 0;
exports.fdefBoundaryParser = fdefBoundaryParser;
const ansi_1 = require("../../../util/text/ansi");
const time_1 = require("../../../util/text/time");
const joi_1 = __importDefault(require("joi"));
const slice_query_parser_1 = require("../../../cli/repl/parser/slice-query-parser");
const provenance_query_executor_1 = require("./provenance-query-executor");
const df_helper_1 = require("../../../dataflow/graph/df-helper");
/**
* Checks whether the given argument represents a fdef boundary with an `f` suffix.
*/
function fdefBoundaryParser(argument) {
const endBracket = argument.indexOf(')');
return argument[endBracket + 1] === 'f';
}
function provenanceQueryLineParser(output, line, _config) {
const criterion = (0, slice_query_parser_1.sliceCriteriaParser)(line[0]);
const stopFdef = fdefBoundaryParser(line[0]);
if (!criterion || criterion.length !== 1) {
output.stderr(output.formatter.format('Invalid provenance query format, a single slicing criterion must be given in the form "(criterion1)"', { color: 1 /* Colors.Red */, effect: ansi_1.ColorEffect.Foreground, style: 1 /* FontStyles.Bold */ }));
return { query: [] };
}
return { query: [{
type: 'provenance',
criterion: criterion[0],
restrictFdef: stopFdef
}], rCode: line[1] };
}
exports.ProvenanceQueryDefinition = {
executor: provenance_query_executor_1.executeProvenanceQuery,
asciiSummarizer: async (formatter, analyzer, queryResults, result) => {
const out = queryResults;
const df = await analyzer.dataflow();
result.push(`Query: ${(0, ansi_1.bold)('provenance', formatter)} (${(0, time_1.printAsMs)(out['.meta'].timing, 0)})`);
for (const [key, obj] of Object.entries(out.results)) {
result.push(` ╰ Provenance for ${key}`);
const dfg = df_helper_1.Dataflow.reduceGraph(df.graph, new Set(obj));
result.push(` ╰ [Mermaid Url](${df_helper_1.Dataflow.visualize.mermaid.url(dfg)})`);
}
return true;
},
fromLine: provenanceQueryLineParser,
schema: joi_1.default.object({
type: joi_1.default.string().valid('provenance').required().description('The type of the query.'),
criterion: joi_1.default.string().required().description('The slicing criterion to use.'),
restrictFdef: joi_1.default.boolean().required().description('Whether to stop on fdef boundaries.')
}).description('Provenance query definition'),
flattenInvolvedNodes: (queryResults) => {
const flattened = [];
const out = queryResults;
for (const obj of Object.values(out.results)) {
flattened.push(...obj);
}
return flattened;
}
};
//# sourceMappingURL=provenance-query-format.js.map