File size: 1,294 Bytes
bc20498 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import { locate } from 'locate-character';
import get_code_frame from './get_code_frame.js';
/**
* @extends Error
*/
class CompileError extends Error {
/**
* @type {string}
*/
code = undefined;
/**
* @type {{ line: number; column: number }}
*/
start = undefined;
/**
* @type {{ line: number; column: number }}
*/
end = undefined;
/**
* @type {number}
*/
pos = undefined;
/**
* @type {string}
*/
filename = undefined;
/**
* @type {string}
*/
frame = undefined;
toString() {
return `${this.message} (${this.start.line}:${this.start.column})\n${this.frame}`;
}
}
/**
* @param {string} message
* @param {{
* name: string;
* code: string;
* source: string;
* filename: string;
* start: number;
* end?: number;
* }} props
* @returns {never}
*/
export default function error(message, props) {
const error = new CompileError(message);
error.name = props.name;
const start = locate(props.source, props.start, { offsetLine: 1 });
const end = locate(props.source, props.end || props.start, { offsetLine: 1 });
error.code = props.code;
error.start = start;
error.end = end;
error.pos = props.start;
error.filename = props.filename;
error.frame = get_code_frame(props.source, start.line - 1, start.column);
throw error;
}
|