plsm-ts/src/errors.ts
2025-03-04 20:54:46 +01:00

39 lines
1.2 KiB
TypeScript

import type { SourceRange } from "./frontend/ast/node";
import { getFile } from "./io/files";
const errors: [SourceRange, string][] = []
export function raiseError(sourceRange: SourceRange, message: string) {
errors.push([sourceRange, message]);
}
export function hasErrors() {
return errors.length > 0;
}
export function getErrors() {
return [...errors];
}
function getPreviousLines(content: string, line: number, count: number = 6) {
let lines = content.split("\n");
lines = lines.slice(Math.max(0, line - count), line);
while (!lines[0].trim().length) lines.shift();
while (!lines[lines.length - 1].trim().length) lines.pop();
return lines.join('\n');
}
export function printErrors() {
for (let i = 0; i < errors.length; i++) {
const [sourceRange, message] = errors[i];
const { path, content } = getFile(sourceRange.file);
const ctx = getPreviousLines(content, sourceRange.start[0]);
process.stderr.write(`in ${path}:${sourceRange.start[0]}:${sourceRange.start[1] + 1}\n`);
process.stderr.write('\x1b[90m' + ctx + '\x1b[0m\n');
process.stderr.write('\x1b[91m' + message + '\x1b[0m\n');
if (i < errors.length - 1) process.stderr.write('\n');
}
}