UNPKG

@eagleoutice/flowr-dev

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

106 lines 5.18 kB
"use strict"; 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>&#92;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