| 1 | var createCustomError = require('../utils/createCustomError');
|
|---|
| 2 | var generate = require('../definition-syntax/generate');
|
|---|
| 3 |
|
|---|
| 4 | function fromMatchResult(matchResult) {
|
|---|
| 5 | var tokens = matchResult.tokens;
|
|---|
| 6 | var longestMatch = matchResult.longestMatch;
|
|---|
| 7 | var node = longestMatch < tokens.length ? tokens[longestMatch].node : null;
|
|---|
| 8 | var mismatchOffset = -1;
|
|---|
| 9 | var entries = 0;
|
|---|
| 10 | var css = '';
|
|---|
| 11 |
|
|---|
| 12 | for (var i = 0; i < tokens.length; i++) {
|
|---|
| 13 | if (i === longestMatch) {
|
|---|
| 14 | mismatchOffset = css.length;
|
|---|
| 15 | }
|
|---|
| 16 |
|
|---|
| 17 | if (node !== null && tokens[i].node === node) {
|
|---|
| 18 | if (i <= longestMatch) {
|
|---|
| 19 | entries++;
|
|---|
| 20 | } else {
|
|---|
| 21 | entries = 0;
|
|---|
| 22 | }
|
|---|
| 23 | }
|
|---|
| 24 |
|
|---|
| 25 | css += tokens[i].value;
|
|---|
| 26 | }
|
|---|
| 27 |
|
|---|
| 28 | return {
|
|---|
| 29 | node: node,
|
|---|
| 30 | css: css,
|
|---|
| 31 | mismatchOffset: mismatchOffset === -1 ? css.length : mismatchOffset,
|
|---|
| 32 | last: node === null || entries > 1
|
|---|
| 33 | };
|
|---|
| 34 | }
|
|---|
| 35 |
|
|---|
| 36 | function getLocation(node, point) {
|
|---|
| 37 | var loc = node && node.loc && node.loc[point];
|
|---|
| 38 |
|
|---|
| 39 | if (loc) {
|
|---|
| 40 | return {
|
|---|
| 41 | offset: loc.offset,
|
|---|
| 42 | line: loc.line,
|
|---|
| 43 | column: loc.column
|
|---|
| 44 | };
|
|---|
| 45 | }
|
|---|
| 46 |
|
|---|
| 47 | return null;
|
|---|
| 48 | }
|
|---|
| 49 |
|
|---|
| 50 | var SyntaxReferenceError = function(type, referenceName) {
|
|---|
| 51 | var error = createCustomError(
|
|---|
| 52 | 'SyntaxReferenceError',
|
|---|
| 53 | type + (referenceName ? ' `' + referenceName + '`' : '')
|
|---|
| 54 | );
|
|---|
| 55 |
|
|---|
| 56 | error.reference = referenceName;
|
|---|
| 57 |
|
|---|
| 58 | return error;
|
|---|
| 59 | };
|
|---|
| 60 |
|
|---|
| 61 | var MatchError = function(message, syntax, node, matchResult) {
|
|---|
| 62 | var error = createCustomError('SyntaxMatchError', message);
|
|---|
| 63 | var details = fromMatchResult(matchResult);
|
|---|
| 64 | var mismatchOffset = details.mismatchOffset || 0;
|
|---|
| 65 | var badNode = details.node || node;
|
|---|
| 66 | var end = getLocation(badNode, 'end');
|
|---|
| 67 | var start = details.last ? end : getLocation(badNode, 'start');
|
|---|
| 68 | var css = details.css;
|
|---|
| 69 |
|
|---|
| 70 | error.rawMessage = message;
|
|---|
| 71 | error.syntax = syntax ? generate(syntax) : '<generic>';
|
|---|
| 72 | error.css = css;
|
|---|
| 73 | error.mismatchOffset = mismatchOffset;
|
|---|
| 74 | error.loc = {
|
|---|
| 75 | source: (badNode && badNode.loc && badNode.loc.source) || '<unknown>',
|
|---|
| 76 | start: start,
|
|---|
| 77 | end: end
|
|---|
| 78 | };
|
|---|
| 79 | error.line = start ? start.line : undefined;
|
|---|
| 80 | error.column = start ? start.column : undefined;
|
|---|
| 81 | error.offset = start ? start.offset : undefined;
|
|---|
| 82 | error.message = message + '\n' +
|
|---|
| 83 | ' syntax: ' + error.syntax + '\n' +
|
|---|
| 84 | ' value: ' + (error.css || '<empty string>') + '\n' +
|
|---|
| 85 | ' --------' + new Array(error.mismatchOffset + 1).join('-') + '^';
|
|---|
| 86 |
|
|---|
| 87 | return error;
|
|---|
| 88 | };
|
|---|
| 89 |
|
|---|
| 90 | module.exports = {
|
|---|
| 91 | SyntaxReferenceError: SyntaxReferenceError,
|
|---|
| 92 | MatchError: MatchError
|
|---|
| 93 | };
|
|---|