import { SourceLocation } from './ast' export interface CompilerError extends SyntaxError { code: ErrorCodes loc?: SourceLocation } export function defaultOnError(error: CompilerError) { throw error } export function createCompilerError( code: ErrorCodes, loc?: SourceLocation ): CompilerError { const msg = __DEV__ || !__BROWSER__ ? errorMessages[code] : code const locInfo = loc ? ` (${loc.start.line}:${loc.start.column})` : `` const error = new SyntaxError(msg + locInfo) as CompilerError error.code = code error.loc = loc return error } export const enum ErrorCodes { // parse errors ABRUPT_CLOSING_OF_EMPTY_COMMENT, ABSENCE_OF_DIGITS_IN_NUMERIC_CHARACTER_REFERENCE, CDATA_IN_HTML_CONTENT, CHARACTER_REFERENCE_OUTSIDE_UNICODE_RANGE, CONTROL_CHARACTER_REFERENCE, DUPLICATE_ATTRIBUTE, END_TAG_WITH_ATTRIBUTES, END_TAG_WITH_TRAILING_SOLIDUS, EOF_BEFORE_TAG_NAME, EOF_IN_CDATA, EOF_IN_COMMENT, EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT, EOF_IN_TAG, INCORRECTLY_CLOSED_COMMENT, INCORRECTLY_OPENED_COMMENT, INVALID_FIRST_CHARACTER_OF_TAG_NAME, MISSING_ATTRIBUTE_VALUE, MISSING_END_TAG_NAME, MISSING_SEMICOLON_AFTER_CHARACTER_REFERENCE, MISSING_WHITESPACE_BETWEEN_ATTRIBUTES, NESTED_COMMENT, NONCHARACTER_CHARACTER_REFERENCE, NULL_CHARACTER_REFERENCE, SURROGATE_CHARACTER_REFERENCE, UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME, UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE, UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME, UNEXPECTED_NULL_CHARACTER, UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME, UNEXPECTED_SOLIDUS_IN_TAG, UNKNOWN_NAMED_CHARACTER_REFERENCE, // Vue-specific parse errors X_INVALID_END_TAG, X_MISSING_END_TAG, X_MISSING_INTERPOLATION_END, X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END, // transform errors X_ELSE_IF_NO_ADJACENT_IF, X_ELSE_NO_ADJACENT_IF, X_FOR_NO_EXPRESSION, X_FOR_MALFORMED_EXPRESSION, X_V_BIND_NO_EXPRESSION, X_V_ON_NO_EXPRESSION, X_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET, X_NAMED_SLOT_ON_COMPONENT, X_MIXED_SLOT_USAGE, X_DUPLICATE_SLOT_NAMES, X_EXTRANEOUS_NON_SLOT_CHILDREN, // generic errors X_PREFIX_ID_NOT_SUPPORTED, X_MODULE_MODE_NOT_SUPPORTED } export const errorMessages: { [code: number]: string } = { // parse errors [ErrorCodes.ABRUPT_CLOSING_OF_EMPTY_COMMENT]: 'Illegal comment.', [ErrorCodes.ABSENCE_OF_DIGITS_IN_NUMERIC_CHARACTER_REFERENCE]: 'Illegal numeric character reference: invalid character.', [ErrorCodes.CDATA_IN_HTML_CONTENT]: 'CDATA section is allowed only in XML context.', [ErrorCodes.CHARACTER_REFERENCE_OUTSIDE_UNICODE_RANGE]: 'Illegal numeric character reference: too big.', [ErrorCodes.CONTROL_CHARACTER_REFERENCE]: 'Illegal numeric character reference: control character.', [ErrorCodes.DUPLICATE_ATTRIBUTE]: 'Duplicate attribute.', [ErrorCodes.END_TAG_WITH_ATTRIBUTES]: 'End tag cannot have attributes.', [ErrorCodes.END_TAG_WITH_TRAILING_SOLIDUS]: "Illegal '/' in tags.", [ErrorCodes.EOF_BEFORE_TAG_NAME]: 'Unexpected EOF in tag.', [ErrorCodes.EOF_IN_CDATA]: 'Unexpected EOF in CDATA section.', [ErrorCodes.EOF_IN_COMMENT]: 'Unexpected EOF in comment.', [ErrorCodes.EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT]: 'Unexpected EOF in script.', [ErrorCodes.EOF_IN_TAG]: 'Unexpected EOF in tag.', [ErrorCodes.INCORRECTLY_CLOSED_COMMENT]: 'Incorrectly closed comment.', [ErrorCodes.INCORRECTLY_OPENED_COMMENT]: 'Incorrectly opened comment.', [ErrorCodes.INVALID_FIRST_CHARACTER_OF_TAG_NAME]: "Illegal tag name. Use '<' to print '<'.", [ErrorCodes.MISSING_ATTRIBUTE_VALUE]: 'Attribute value was expected.', [ErrorCodes.MISSING_END_TAG_NAME]: 'End tag name was expected.', [ErrorCodes.MISSING_SEMICOLON_AFTER_CHARACTER_REFERENCE]: 'Semicolon was expected.', [ErrorCodes.MISSING_WHITESPACE_BETWEEN_ATTRIBUTES]: 'Whitespace was expected.', [ErrorCodes.NESTED_COMMENT]: "Unexpected '