@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
97 lines • 4.49 kB
JavaScript
;
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