UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

82 lines 4.45 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.StaticSliceQueryDefinition = void 0; const ansi_1 = require("../../../util/text/ansi"); const time_1 = require("../../../util/text/time"); const joi_1 = __importDefault(require("joi")); const static_slice_query_executor_1 = require("./static-slice-query-executor"); const query_print_1 = require("../../query-print"); const slice_query_parser_1 = require("../../../cli/repl/parser/slice-query-parser"); const slice_direction_1 = require("../../../util/slice-direction"); function sliceQueryLineParser(output, line, _config) { const criteria = (0, slice_query_parser_1.sliceCriteriaParser)(line[0]); const direction = (0, slice_query_parser_1.sliceDirectionParser)(line[0]); if (!criteria || criteria.length === 0) { output.stderr(output.formatter.format('Invalid static-slice query format, slicing criteria must be given in the form "(criterion1;criterion2;...)"', { color: 1 /* Colors.Red */, effect: ansi_1.ColorEffect.Foreground, style: 1 /* FontStyles.Bold */ })); return { query: [] }; } return { query: [ { type: 'static-slice', criteria: criteria, direction: direction, } ], rCode: line[1] }; } exports.StaticSliceQueryDefinition = { executor: static_slice_query_executor_1.executeStaticSliceQuery, asciiSummarizer: (formatter, _analyzer, queryResults, result) => { const out = queryResults; if (Object.keys(out.results).length === 1) { // just print the single result without fingerprint const [, obj] = Object.entries(out.results)[0]; if ('reconstruct' in obj) { const code = Array.isArray(obj.reconstruct.code) ? obj.reconstruct.code : [obj.reconstruct.code]; if (code.length === 1) { result.push(code[0]); return true; } } } result.push(`Query: ${(0, ansi_1.bold)('static-slice', formatter)} (${(0, time_1.printAsMs)(out['.meta'].timing, 0)})`); for (const [fingerprint, obj] of Object.entries(out.results)) { const { criteria, noMagicComments, noReconstruction } = JSON.parse(fingerprint); const addons = []; if (noReconstruction) { addons.push('no reconstruction'); } if (noMagicComments) { addons.push('no magic comments'); } result.push(` ╰ Slice for {${criteria.join(', ')}} ${addons.join(', ')}`); if ('reconstruct' in obj) { const code = Array.isArray(obj.reconstruct.code) ? obj.reconstruct.code : [obj.reconstruct.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: sliceQueryLineParser, schema: joi_1.default.object({ type: joi_1.default.string().valid('static-slice').required().description('The type of the query.'), criteria: joi_1.default.array().items(joi_1.default.string()).min(0).required().description('The slicing criteria to use.'), noReconstruction: joi_1.default.boolean().optional().description('Do not reconstruct the slice into readable code.'), noMagicComments: joi_1.default.boolean().optional().description('Should the magic comments (force-including lines within the slice) be ignored?'), direction: joi_1.default.string().valid(...Object.values(slice_direction_1.SliceDirection)).optional().description('The direction to slice in. Defaults to backward slicing if unset.') }).description('Slice query used to slice the dataflow graph'), flattenInvolvedNodes: (queryResults) => { const flattened = []; const out = queryResults; for (const [_, obj] of Object.entries(out.results)) { flattened.push(...obj.slice.result); } return flattened; } }; //# sourceMappingURL=static-slice-query-format.js.map