| var createCustomError = require('../utils/createCustomError'); | 
| var generate = require('../definition-syntax/generate'); | 
|   | 
| function fromMatchResult(matchResult) { | 
|     var tokens = matchResult.tokens; | 
|     var longestMatch = matchResult.longestMatch; | 
|     var node = longestMatch < tokens.length ? tokens[longestMatch].node : null; | 
|     var mismatchOffset = -1; | 
|     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; | 
|     } | 
|   | 
|     return { | 
|         node: node, | 
|         css: css, | 
|         mismatchOffset: mismatchOffset === -1 ? css.length : 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, 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 ? generate(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 | 
| }; |