@eagleoutice/flowr-dev
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
106 lines • 5.18 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DiceQueryDefinition = void 0;
const ansi_1 = require("../../../util/text/ansi");
const time_1 = require("../../../util/text/time");
const joi_1 = __importDefault(require("joi"));
const dice_query_executor_1 = require("./dice-query-executor");
const query_print_1 = require("../../query-print");
const slice_query_parser_1 = require("../../../cli/repl/parser/slice-query-parser");
const slice_query_options_1 = require("../slice-query-options");
const diceFormat = '(from1;from2->to1;to2)';
function diceQueryLineParser(output, line, _config) {
const parsed = (0, slice_query_parser_1.diceCriteriaParser)(line[0]);
if (!parsed) {
output.stderr(output.formatter.format(`Invalid dice query format. Expected ${diceFormat}, e.g. (2@x->12@x) or (1@a;2@b->5@c).`, { color: 1 /* Colors.Red */, effect: ansi_1.ColorEffect.Foreground, style: 1 /* FontStyles.Bold */ }));
return { query: [] };
}
(0, slice_query_parser_1.warnAboutSliceFlags)(output, line[0], slice_query_parser_1.SharedSliceFlags);
return {
query: [{ type: 'dice', from: parsed.from, to: parsed.to, ...(0, slice_query_parser_1.sliceQueryOptionsParser)(line[0]) }],
rCode: (0, slice_query_parser_1.queryLineCode)(line)
};
}
function diceQueryCompleter(line, startingNewArg, _config) {
if (line.length === 0) {
return { completions: ['('] };
}
if (startingNewArg || line.length !== 1) {
return { completions: [] };
}
const arg = line[0];
const flags = (0, slice_query_parser_1.sliceFlagCompletions)(arg, slice_query_parser_1.SharedSliceFlags);
if (flags) {
return flags;
}
const hasArrow = arg.includes('->');
const side = hasArrow ? arg.slice(arg.indexOf('->') + 2) : arg.slice(1);
const fragment = side.slice(side.lastIndexOf(';') + 1);
if (/^\d+$/.test(fragment)) {
return { completions: [`${arg}@`], argumentPart: arg };
}
if (/^\d+@\w+$/.test(fragment)) {
return { completions: [hasArrow ? `${arg}) ` : `${arg}->`], argumentPart: arg };
}
return { completions: [] };
}
exports.DiceQueryDefinition = {
title: 'Dice Query',
executor: dice_query_executor_1.executeDiceQuery,
asciiSummarizer: (formatter, _analyzer, queryResults, result) => {
const out = queryResults;
if (Object.keys(out.results).length === 1) {
const [, obj] = Object.entries(out.results)[0];
const rec = obj.reconstruct;
if (rec !== undefined) {
const code = Array.isArray(rec.code) ? rec.code : [rec.code];
if (code.length === 1) {
result.push(code[0]);
return true;
}
}
}
result.push(`Query: ${(0, ansi_1.bold)('dice', formatter)} (${(0, time_1.printAsMs)(out['.meta'].timing, 0)})`);
for (const [fingerprint, obj] of Object.entries(out.results)) {
const { from, to, noReconstruction, noMagicComments } = JSON.parse(fingerprint);
const addons = [];
if (noReconstruction) {
addons.push('no reconstruction');
}
if (noMagicComments) {
addons.push('no magic comments');
}
result.push(` ╰ Dice from {${from.join(', ')}} to {${to.join(', ')}} ${addons.join(', ')}`);
const rec = obj.reconstruct;
if (rec !== undefined) {
const code = Array.isArray(rec.code) ? rec.code : [rec.code];
result.push(' ╰ Code (newline as <code>\n</code>): <code>' + code.flatMap(c => c.split('\n')).join('\\n') + '</code>');
}
else {
result.push(` ╰ Id List: {${(0, query_print_1.summarizeIdsIfTooLong)(formatter, [...obj.slice.result])}}`);
}
}
return true;
},
fromLine: diceQueryLineParser,
completer: diceQueryCompleter,
syntax: '@dice (<crit>;...->crit;...)[iIcB] <code | file://path>',
schema: joi_1.default.object({
type: joi_1.default.string().valid('dice').required().description('The type of the query.'),
from: joi_1.default.array().items(joi_1.default.string()).min(1).required().description('Slicing criteria for the start of the dice (forward slice seeds).'),
to: joi_1.default.array().items(joi_1.default.string()).min(1).required().description('Slicing criteria for the end of the dice (backward slice seeds).'),
...slice_query_options_1.SliceQueryOptionsSchema
}).description('Dice query: selects only paths from the given start nodes that reach the given end nodes.'),
flattenInvolvedNodes: (queryResults) => {
const flattened = [];
const out = queryResults;
for (const [, obj] of Object.entries(out.results)) {
flattened.push(...obj.slice.result);
}
return flattened;
}
};
//# sourceMappingURL=dice-query-format.js.map