error.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. 'use strict';
  2. var createCustomError = require('../utils/createCustomError');
  3. var generateGrammar = require('./grammar/generate');
  4. function getLocation(node, point) {
  5. var loc = node && node.loc && node.loc[point];
  6. return loc
  7. ? { offset: loc.offset,
  8. line: loc.line,
  9. column: loc.column }
  10. : null;
  11. }
  12. var SyntaxReferenceError = function(type, referenceName) {
  13. var error = createCustomError(
  14. 'SyntaxReferenceError',
  15. type + (referenceName ? ' `' + referenceName + '`' : '')
  16. );
  17. error.reference = referenceName;
  18. return error;
  19. };
  20. var MatchError = function(message, lexer, syntax, value, badNode) {
  21. var error = createCustomError('SyntaxMatchError', message);
  22. var errorOffset = -1;
  23. var start = getLocation(badNode, 'start');
  24. var end = getLocation(badNode, 'end');
  25. var css = lexer.syntax.generate(value, {
  26. decorator: function(handlers) {
  27. var bufferOffset = 0;
  28. var handlersChunk = handlers.chunk;
  29. handlers.chunk = function(chunk) {
  30. bufferOffset += chunk.length;
  31. handlersChunk(chunk);
  32. };
  33. var handlersNode = handlers.node;
  34. handlers.node = function(node) {
  35. if (node === badNode) {
  36. errorOffset = bufferOffset;
  37. }
  38. handlersNode.call(this, node);
  39. };
  40. return handlers;
  41. }
  42. });
  43. if (errorOffset === -1) {
  44. errorOffset = css.length;
  45. }
  46. error.rawMessage = message;
  47. error.syntax = syntax ? generateGrammar(syntax) : '<generic>';
  48. error.css = css;
  49. error.mismatchOffset = errorOffset;
  50. error.loc = {
  51. source: badNode && badNode.loc && badNode.loc.source || '<unknown>',
  52. start: start,
  53. end: end
  54. };
  55. error.line = start ? start.line : undefined;
  56. error.column = start ? start.column : undefined;
  57. error.offset = start ? start.offset : undefined;
  58. error.message = message + '\n' +
  59. ' syntax: ' + error.syntax + '\n' +
  60. ' value: ' + (error.css || '<empty string>') + '\n' +
  61. ' --------' + new Array(error.mismatchOffset + 1).join('-') + '^';
  62. return error;
  63. };
  64. module.exports = {
  65. SyntaxReferenceError: SyntaxReferenceError,
  66. MatchError: MatchError
  67. };