error.js 2.6 KB

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