UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

97 lines 4.49 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.asciiCallContext = asciiCallContext; exports.summarizeIdsIfTooLong = summarizeIdsIfTooLong; exports.asciiSummaryOfQueryResult = asciiSummaryOfQueryResult; const ansi_1 = require("../util/text/ansi"); const query_1 = require("./query"); const html_hover_over_1 = require("../util/html-hover-over"); const time_1 = require("../util/text/time"); const built_in_1 = require("../dataflow/environments/built-in"); function nodeString(nodeId, formatter, processed) { const isObj = typeof nodeId === 'object' && nodeId !== null && 'id' in nodeId; const id = isObj ? nodeId.id : nodeId; const info = isObj ? nodeId.info : undefined; if ((0, built_in_1.isBuiltIn)(id)) { return (0, ansi_1.italic)(id, formatter) + (info ? ` (${JSON.stringify(info)})` : ''); } const node = processed.normalize.idMap.get(id); if (node === undefined) { return `UNKNOWN: ${id} (info: ${JSON.stringify(info)})`; } return `${(0, ansi_1.italic)('`' + (node.lexeme ?? node.info.fullLexeme ?? 'UNKNOWN') + '`', formatter)} (L.${node.location?.[0]}${info ? ', ' + JSON.stringify(info) : ''})`; } function asciiCallContextSubHit(formatter, results, processed) { const result = []; for (const { id, calls = [], linkedIds = [], aliasRoots = [] } of results) { const node = processed.normalize.idMap.get(id); if (node === undefined) { result.push(` ${(0, ansi_1.bold)('UNKNOWN: ' + JSON.stringify({ calls, linkedIds }))}`); continue; } let line = nodeString(id, formatter, processed); if (calls.length > 0) { line += ` with ${calls.length} call${calls.length > 1 ? 's' : ''} (${calls.map(c => nodeString(c, formatter, processed)).join(', ')})`; } if (linkedIds.length > 0) { line += ` with ${linkedIds.length} link${linkedIds.length > 1 ? 's' : ''} (${linkedIds.map(c => nodeString(c, formatter, processed)).join(', ')})`; } if (aliasRoots.length > 0) { line += ` with ${aliasRoots.length} alias root${aliasRoots.length > 1 ? 's' : ''} (${aliasRoots.map(c => nodeString(c, formatter, processed)).join(', ')})`; } result.push(line); } return result.join(', '); } function asciiCallContext(formatter, results, processed) { /* traverse over 'kinds' and within them 'subkinds' */ const result = []; for (const [kind, { subkinds }] of Object.entries(results['kinds'])) { result.push(` ╰ ${(0, ansi_1.bold)(kind, formatter)}`); for (const [subkind, values] of Object.entries(subkinds)) { result.push(` ╰ ${(0, ansi_1.bold)(subkind, formatter)}: ${asciiCallContextSubHit(formatter, values, processed)}`); } } return result.join('\n'); } function summarizeIdsIfTooLong(formatter, ids) { const naive = ids.join(', '); if (naive.length <= 20) { return naive; } let acc = ''; let i = 0; while (acc.length <= 20) { acc += ids[i++] + ', '; } if (i < ids.length) { acc += '... (see JSON)'; } return formatter === ansi_1.markdownFormatter ? (0, html_hover_over_1.textWithTooltip)(acc, JSON.stringify(ids)) : acc; } function asciiSummaryOfQueryResult(formatter, totalInMs, results, processed) { const result = []; for (const [query, queryResults] of Object.entries(results)) { if (query === '.meta') { continue; } const queryType = query_1.SupportedQueries[query]; if (queryType.asciiSummarizer(formatter, processed, queryResults, result)) { continue; } result.push(`Query: ${(0, ansi_1.bold)(query, formatter)}`); let timing = -1; // eslint-disable-next-line @typescript-eslint/no-unsafe-argument for (const [key, value] of Object.entries(queryResults)) { if (key === '.meta') { timing = value.timing; continue; } result.push(` ╰ ${key}: ${JSON.stringify(value)}`); } result.push(` - Took ${(0, time_1.printAsMs)(timing, 0)}`); } result.push((0, ansi_1.italic)(`All queries together required ≈${(0, time_1.printAsMs)(results['.meta'].timing, 0)} (1ms accuracy, total ${(0, time_1.printAsMs)(totalInMs, 0)})`, formatter)); return formatter.format(result.join('\n')); } //# sourceMappingURL=query-print.js.map