| 'use strict'; |
| |
| var createCustomError = require('../utils/createCustomError'); |
| var generateGrammar = require('./grammar/generate'); |
| |
| function fromMatchResult(matchResult) { |
| var tokens = matchResult.tokens; |
| var longestMatch = matchResult.longestMatch; |
| var node = longestMatch < tokens.length ? tokens[longestMatch].node : null; |
| var mismatchOffset = 0; |
| var entries = 0; |
| var css = ''; |
| |
| for (var i = 0; i < tokens.length; i++) { |
| if (i === longestMatch) { |
| mismatchOffset = css.length; |
| } |
| |
| if (node !== null && tokens[i].node === node) { |
| if (i <= longestMatch) { |
| entries++; |
| } else { |
| entries = 0; |
| } |
| } |
| |
| css += tokens[i].value; |
| } |
| |
| if (node === null) { |
| mismatchOffset = css.length; |
| } |
| |
| return { |
| node: node, |
| css: css, |
| mismatchOffset: mismatchOffset, |
| last: node === null || entries > 1 |
| }; |
| } |
| |
| function getLocation(node, point) { |
| var loc = node && node.loc && node.loc[point]; |
| |
| if (loc) { |
| return { |
| offset: loc.offset, |
| line: loc.line, |
| column: loc.column |
| }; |
| } |
| |
| return null; |
| } |
| |
| var SyntaxReferenceError = function(type, referenceName) { |
| var error = createCustomError( |
| 'SyntaxReferenceError', |
| type + (referenceName ? ' `' + referenceName + '`' : '') |
| ); |
| |
| error.reference = referenceName; |
| |
| return error; |
| }; |
| |
| var MatchError = function(message, lexer, syntax, node, matchResult) { |
| var error = createCustomError('SyntaxMatchError', message); |
| var details = fromMatchResult(matchResult); |
| var mismatchOffset = details.mismatchOffset || 0; |
| var badNode = details.node || node; |
| var end = getLocation(badNode, 'end'); |
| var start = details.last ? end : getLocation(badNode, 'start'); |
| var css = details.css; |
| |
| error.rawMessage = message; |
| error.syntax = syntax ? generateGrammar(syntax) : '<generic>'; |
| error.css = css; |
| error.mismatchOffset = mismatchOffset; |
| error.loc = { |
| source: (badNode && badNode.loc && badNode.loc.source) || '<unknown>', |
| start: start, |
| end: end |
| }; |
| error.line = start ? start.line : undefined; |
| error.column = start ? start.column : undefined; |
| error.offset = start ? start.offset : undefined; |
| error.message = message + '\n' + |
| ' syntax: ' + error.syntax + '\n' + |
| ' value: ' + (error.css || '<empty string>') + '\n' + |
| ' --------' + new Array(error.mismatchOffset + 1).join('-') + '^'; |
| |
| return error; |
| }; |
| |
| module.exports = { |
| SyntaxReferenceError: SyntaxReferenceError, |
| MatchError: MatchError |
| }; |