let fs = require('fs').promises;
function collectRecursions(logs) {
let added = {}
let ret = "";
for (let log of logs) {
if (ret.length > 0) {
ret += "\n ⬇️\n";
}
ret += log;
if (added[log]) {
ret += "⭐".repeat(added[log]);
}
added[log] = (added[log] || 0) + 1;
}
return ret;
}
(async () => {
let log = await fs.readFile('out.log', 'utf-8');
let lines = log.split('\n');
let last_idx = 0;
let logs = {};
for (let line of lines) {
if (line.trim().length == 0) {
continue;
}
let matches = /(?<index>[0-9]+)?:? (?<name>.+)/.exec(line);
if (!matches) {
throw new Error(`No matches in ${line}`);
}
if (matches.groups) {
let idx, name;
if (line.startsWith('parse_labelled_statement')){
idx = last_idx;
name = "parse_labelled_statement";
} else {
name = matches.groups.name.split(' ')[0];
}
if (matches.groups.index) {
idx = +matches.groups.index;
last_idx = idx;
}
if (!name.startsWith('parse')) {
continue;
}
if (!logs[idx]) {
logs[idx] = {};
}
if (!logs[idx].name_counts) {
logs[idx].name_counts = {};
}
if (!logs[idx].name_counts[name]) {
logs[idx].name_counts[name] = 1;
} else {
logs[idx].name_counts[name] += 1;
}
if (!logs[idx].names) {
logs[idx].names = [];
}
logs[idx].names.push(name);
}
}
let ret = '';
outer: for (let log in logs) {
let record = logs[log];
for (let name in record.name_counts) {
if (record.name_counts[name] > 1) {
if (ret.length > 0) {
ret += "\n";
}
ret += `${log}\n${collectRecursions(record.names)}`;
continue outer;
}
}
}
return ret;
})()
.then(console.log)
.catch(e => console.error('Error: ', e));