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'); } }