import { Ctx, File } from "./ctx.ts"; export type Span = { begin: Pos; end: Pos; }; export type Pos = { idx: number; line: number; col: number; }; export type Report = { severity: "fatal" | "error" | "warning" | "info"; origin?: string; msg: string; file?: File; span?: Span; pos?: Pos; }; export function prettyPrintReport(ctx: Ctx, rep: Report) { const { severity, msg } = rep; const origin = rep.origin ? `${rep.origin}: ` : ""; console.error(`${origin}${severity}: ${msg}`); if (rep.file && (rep.span || rep.pos)) { const { absPath: path } = ctx.fileInfo(rep.file); const { line, col } = rep.span?.begin ?? rep.pos!; console.error(` at ./${path}:${line}:${col}`); } } export function printStackTrace() { class StackTracer extends Error { constructor() { super("StackTracer"); } } try { throw new StackTracer(); } catch (error) { if (!(error instanceof StackTracer)) { throw error; } console.log( error.stack?.replace( "Error: StackTracer", "Stack trace:", ) ?? error, ); } }