parseUtil.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var chars = require("./chars");
  4. var ParseLocation = (function () {
  5. function ParseLocation(file, offset, line, col) {
  6. this.file = file;
  7. this.offset = offset;
  8. this.line = line;
  9. this.col = col;
  10. }
  11. ParseLocation.prototype.toString = function () {
  12. return this.offset != null ? this.file.url + "@" + this.line + ":" + this.col : this.file.url;
  13. };
  14. ParseLocation.prototype.moveBy = function (delta) {
  15. var source = this.file.content;
  16. var len = source.length;
  17. var offset = this.offset;
  18. var line = this.line;
  19. var col = this.col;
  20. while (offset > 0 && delta < 0) {
  21. offset--;
  22. delta++;
  23. var ch = source.charCodeAt(offset);
  24. if (ch == chars.$LF) {
  25. line--;
  26. var priorLine = source.substr(0, offset - 1).lastIndexOf(String.fromCharCode(chars.$LF));
  27. col = priorLine > 0 ? offset - priorLine : offset;
  28. }
  29. else {
  30. col--;
  31. }
  32. }
  33. while (offset < len && delta > 0) {
  34. var ch = source.charCodeAt(offset);
  35. offset++;
  36. delta--;
  37. if (ch == chars.$LF) {
  38. line++;
  39. col = 0;
  40. }
  41. else {
  42. col++;
  43. }
  44. }
  45. return new ParseLocation(this.file, offset, line, col);
  46. };
  47. ParseLocation.prototype.getContext = function (maxChars, maxLines) {
  48. var content = this.file.content;
  49. var startOffset = this.offset;
  50. if (startOffset != null) {
  51. if (startOffset > content.length - 1) {
  52. startOffset = content.length - 1;
  53. }
  54. var endOffset = startOffset;
  55. var ctxChars = 0;
  56. var ctxLines = 0;
  57. while (ctxChars < maxChars && startOffset > 0) {
  58. startOffset--;
  59. ctxChars++;
  60. if (content[startOffset] == '\n') {
  61. if (++ctxLines == maxLines) {
  62. break;
  63. }
  64. }
  65. }
  66. ctxChars = 0;
  67. ctxLines = 0;
  68. while (ctxChars < maxChars && endOffset < content.length - 1) {
  69. endOffset++;
  70. ctxChars++;
  71. if (content[endOffset] == '\n') {
  72. if (++ctxLines == maxLines) {
  73. break;
  74. }
  75. }
  76. }
  77. return {
  78. before: content.substring(startOffset, this.offset),
  79. after: content.substring(this.offset, endOffset + 1)
  80. };
  81. }
  82. return null;
  83. };
  84. return ParseLocation;
  85. }());
  86. exports.ParseLocation = ParseLocation;
  87. var ParseSourceFile = (function () {
  88. function ParseSourceFile(content, url) {
  89. this.content = content;
  90. this.url = url;
  91. }
  92. return ParseSourceFile;
  93. }());
  94. exports.ParseSourceFile = ParseSourceFile;
  95. var ParseSourceSpan = (function () {
  96. function ParseSourceSpan(start, end, details) {
  97. if (details === void 0) { details = null; }
  98. this.start = start;
  99. this.end = end;
  100. this.details = details;
  101. }
  102. ParseSourceSpan.prototype.toString = function () {
  103. return this.start.file.content.substring(this.start.offset, this.end.offset);
  104. };
  105. return ParseSourceSpan;
  106. }());
  107. exports.ParseSourceSpan = ParseSourceSpan;
  108. var ParseErrorLevel;
  109. (function (ParseErrorLevel) {
  110. ParseErrorLevel[ParseErrorLevel["WARNING"] = 0] = "WARNING";
  111. ParseErrorLevel[ParseErrorLevel["ERROR"] = 1] = "ERROR";
  112. })(ParseErrorLevel = exports.ParseErrorLevel || (exports.ParseErrorLevel = {}));
  113. var ParseError = (function () {
  114. function ParseError(span, msg, level) {
  115. if (level === void 0) { level = ParseErrorLevel.ERROR; }
  116. this.span = span;
  117. this.msg = msg;
  118. this.level = level;
  119. }
  120. ParseError.prototype.contextualMessage = function () {
  121. var ctx = this.span.start.getContext(100, 3);
  122. return ctx ? this.msg + " (\"" + ctx.before + "[" + ParseErrorLevel[this.level] + " ->]" + ctx.after + "\")" : this.msg;
  123. };
  124. ParseError.prototype.toString = function () {
  125. var details = this.span.details ? ", " + this.span.details : '';
  126. return this.contextualMessage() + ": " + this.span.start + details;
  127. };
  128. return ParseError;
  129. }());
  130. exports.ParseError = ParseError;