parjs
Version:
Library for building parsers using combinators.
48 lines (47 loc) • 1.86 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.visualizeTrace = void 0;
const utils_1 = require("../utils");
const functions_1 = require("./functions");
const defaultArgs = {
lineNumbers: true,
linesBefore: 1
};
function newTraceVisualizer(pAgs) {
const args = (0, utils_1.defaults)(pAgs, defaultArgs);
const visualizer = (trace) => {
const rows = trace.input.split(/\r\n|\n|\r/g);
const locRow = trace.location.line;
const around = args.linesBefore;
const firstRow = Math.max(0, locRow - around);
let linesAround = rows.slice(firstRow, locRow + 1);
let prefixLength = 0;
if (args.lineNumbers) {
const numLength = Math.floor(1 + Math.log(locRow + 1) / Math.log(10));
const rowNumberPrefixer = (n) => `${(0, functions_1.padInt)(firstRow + n, numLength, " ")} | `;
prefixLength = numLength + 3;
linesAround = linesAround.map((row, i) => `${rowNumberPrefixer(i + 1)}${row}`);
}
const errorMarked = `${" ".repeat(prefixLength + trace.location.column)}^${trace.reason}`;
linesAround.push(errorMarked);
const linesVisualization = linesAround.join("\n");
const stack = trace.stackTrace
.map(x => {
const base = x;
return `${base.expecting} (${x.type})`;
})
.filter(x => x)
.join("\n");
const fullVisualization = `${trace.kind} failure at Ln ${trace.location.line + 1} Col ${trace.location.column + 1}
${linesVisualization}
Stack:
${stack}
`;
return fullVisualization;
};
visualizer.configure = newTraceVisualizer;
return visualizer;
}
/** Visualizes a Parjs failure. */
exports.visualizeTrace = newTraceVisualizer(defaultArgs);
//# sourceMappingURL=trace-visualizer.js.map