39 lines
1.2 KiB
TypeScript
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');
|
|
}
|
|
}
|