source.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.Source = void 0;
  6. var _env = require("@glimmer/env");
  7. var _util = require("@glimmer/util");
  8. var _span = require("./span");
  9. // eslint-disable-next-line import/no-extraneous-dependencies
  10. class Source {
  11. constructor(source, module = 'an unknown module') {
  12. this.source = source;
  13. this.module = module;
  14. }
  15. /**
  16. * Validate that the character offset represents a position in the source string.
  17. */
  18. check(offset) {
  19. return offset >= 0 && offset <= this.source.length;
  20. }
  21. slice(start, end) {
  22. return this.source.slice(start, end);
  23. }
  24. offsetFor(line, column) {
  25. return _span.SourceOffset.forHbsPos(this, {
  26. line,
  27. column
  28. });
  29. }
  30. spanFor({
  31. start,
  32. end
  33. }) {
  34. return _span.SourceSpan.forHbsLoc(this, {
  35. start: {
  36. line: start.line,
  37. column: start.column
  38. },
  39. end: {
  40. line: end.line,
  41. column: end.column
  42. }
  43. });
  44. }
  45. hbsPosFor(offset) {
  46. let seenLines = 0;
  47. let seenChars = 0;
  48. if (offset > this.source.length) {
  49. return null;
  50. }
  51. while (true) {
  52. let nextLine = this.source.indexOf('\n', seenChars);
  53. if (offset <= nextLine || nextLine === -1) {
  54. return {
  55. line: seenLines + 1,
  56. column: offset - seenChars
  57. };
  58. } else {
  59. seenLines += 1;
  60. seenChars = nextLine + 1;
  61. }
  62. }
  63. }
  64. charPosFor(position) {
  65. let {
  66. line,
  67. column
  68. } = position;
  69. let sourceString = this.source;
  70. let sourceLength = sourceString.length;
  71. let seenLines = 0;
  72. let seenChars = 0;
  73. while (true) {
  74. if (seenChars >= sourceLength) return sourceLength;
  75. let nextLine = this.source.indexOf('\n', seenChars);
  76. if (nextLine === -1) nextLine = this.source.length;
  77. if (seenLines === line - 1) {
  78. if (seenChars + column > nextLine) return nextLine;
  79. if (_env.DEBUG) {
  80. let roundTrip = this.hbsPosFor(seenChars + column);
  81. false && (0, _util.assert)(roundTrip !== null, `the returned offset failed to round-trip`);
  82. false && (0, _util.assert)(roundTrip.line === line, `the round-tripped line didn't match the original line`);
  83. false && (0, _util.assert)(roundTrip.column === column, `the round-tripped column didn't match the original column`);
  84. }
  85. return seenChars + column;
  86. } else if (nextLine === -1) {
  87. return 0;
  88. } else {
  89. seenLines += 1;
  90. seenChars = nextLine + 1;
  91. }
  92. }
  93. }
  94. }
  95. exports.Source = Source;
  96. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvc291cmNlL3NvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7O0FBRUE7O0FBR0E7O0FBTkE7QUFRTSxNQUFBLE1BQUEsQ0FBYTtBQUNqQixFQUFBLFdBQUEsQ0FBQSxNQUFBLEVBQThDLE1BQUEsR0FBOUMsbUJBQUEsRUFBa0Y7QUFBN0QsU0FBQSxNQUFBLEdBQUEsTUFBQTtBQUF5QixTQUFBLE1BQUEsR0FBQSxNQUFBO0FBQXdDO0FBRXRGOzs7OztBQUdBLEVBQUEsS0FBSyxDQUFBLE1BQUEsRUFBZTtBQUNsQixXQUFPLE1BQU0sSUFBTixDQUFBLElBQWUsTUFBTSxJQUFJLEtBQUEsTUFBQSxDQUFoQyxNQUFBO0FBQ0Q7O0FBRUQsRUFBQSxLQUFLLENBQUEsS0FBQSxFQUFBLEdBQUEsRUFBMkI7QUFDOUIsV0FBTyxLQUFBLE1BQUEsQ0FBQSxLQUFBLENBQUEsS0FBQSxFQUFQLEdBQU8sQ0FBUDtBQUNEOztBQUVELEVBQUEsU0FBUyxDQUFBLElBQUEsRUFBQSxNQUFBLEVBQTZCO0FBQ3BDLFdBQU8sbUJBQUEsU0FBQSxDQUFBLElBQUEsRUFBNkI7QUFBQSxNQUFBLElBQUE7QUFBUSxNQUFBO0FBQVIsS0FBN0IsQ0FBUDtBQUNEOztBQUVELEVBQUEsT0FBTyxDQUFDO0FBQUEsSUFBQSxLQUFBO0FBQVMsSUFBQTtBQUFULEdBQUQsRUFBeUM7QUFDOUMsV0FBTyxpQkFBQSxTQUFBLENBQUEsSUFBQSxFQUEyQjtBQUNoQyxNQUFBLEtBQUssRUFBRTtBQUFFLFFBQUEsSUFBSSxFQUFFLEtBQUssQ0FBYixJQUFBO0FBQW9CLFFBQUEsTUFBTSxFQUFFLEtBQUssQ0FBQztBQUFsQyxPQUR5QjtBQUVoQyxNQUFBLEdBQUcsRUFBRTtBQUFFLFFBQUEsSUFBSSxFQUFFLEdBQUcsQ0FBWCxJQUFBO0FBQWtCLFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUE5QjtBQUYyQixLQUEzQixDQUFQO0FBSUQ7O0FBRUQsRUFBQSxTQUFTLENBQUEsTUFBQSxFQUFlO0FBQ3RCLFFBQUksU0FBUyxHQUFiLENBQUE7QUFDQSxRQUFJLFNBQVMsR0FBYixDQUFBOztBQUVBLFFBQUksTUFBTSxHQUFHLEtBQUEsTUFBQSxDQUFiLE1BQUEsRUFBaUM7QUFDL0IsYUFBQSxJQUFBO0FBQ0Q7O0FBRUQsV0FBQSxJQUFBLEVBQWE7QUFDWCxVQUFJLFFBQVEsR0FBRyxLQUFBLE1BQUEsQ0FBQSxPQUFBLENBQUEsSUFBQSxFQUFmLFNBQWUsQ0FBZjs7QUFFQSxVQUFJLE1BQU0sSUFBTixRQUFBLElBQXNCLFFBQVEsS0FBSyxDQUF2QyxDQUFBLEVBQTJDO0FBQ3pDLGVBQU87QUFDTCxVQUFBLElBQUksRUFBRSxTQUFTLEdBRFYsQ0FBQTtBQUVMLFVBQUEsTUFBTSxFQUFFLE1BQU0sR0FBRztBQUZaLFNBQVA7QUFERixPQUFBLE1BS087QUFDTCxRQUFBLFNBQVMsSUFBVCxDQUFBO0FBQ0EsUUFBQSxTQUFTLEdBQUcsUUFBUSxHQUFwQixDQUFBO0FBQ0Q7QUFDRjtBQUNGOztBQUVELEVBQUEsVUFBVSxDQUFBLFFBQUEsRUFBeUI7QUFDakMsUUFBSTtBQUFBLE1BQUEsSUFBQTtBQUFRLE1BQUE7QUFBUixRQUFKLFFBQUE7QUFDQSxRQUFJLFlBQVksR0FBRyxLQUFuQixNQUFBO0FBQ0EsUUFBSSxZQUFZLEdBQUcsWUFBWSxDQUEvQixNQUFBO0FBQ0EsUUFBSSxTQUFTLEdBQWIsQ0FBQTtBQUNBLFFBQUksU0FBUyxHQUFiLENBQUE7O0FBRUEsV0FBQSxJQUFBLEVBQWE7QUFDWCxVQUFJLFNBQVMsSUFBYixZQUFBLEVBQStCLE9BQUEsWUFBQTtBQUUvQixVQUFJLFFBQVEsR0FBRyxLQUFBLE1BQUEsQ0FBQSxPQUFBLENBQUEsSUFBQSxFQUFmLFNBQWUsQ0FBZjtBQUNBLFVBQUksUUFBUSxLQUFLLENBQWpCLENBQUEsRUFBcUIsUUFBUSxHQUFHLEtBQUEsTUFBQSxDQUFYLE1BQUE7O0FBRXJCLFVBQUksU0FBUyxLQUFLLElBQUksR0FBdEIsQ0FBQSxFQUE0QjtBQUMxQixZQUFJLFNBQVMsR0FBVCxNQUFBLEdBQUosUUFBQSxFQUFtQyxPQUFBLFFBQUE7O0FBRW5DLFlBQUEsVUFBQSxFQUFXO0FBQ1QsY0FBSSxTQUFTLEdBQUcsS0FBQSxTQUFBLENBQWUsU0FBUyxHQUF4QyxNQUFnQixDQUFoQjtBQURTLG1CQUVULGtCQUFPLFNBQVMsS0FBVixJQUFOLEVBRlMsMENBRVQsQ0FGUztBQUFBLG1CQUdULGtCQUFPLFNBQVMsQ0FBVCxJQUFBLEtBQUQsSUFBTixFQUhTLHVEQUdULENBSFM7QUFBQSxtQkFJVCxrQkFDRSxTQUFTLENBQVQsTUFBQSxLQURJLE1BQU4sRUFKUywyREFJVCxDQUpTO0FBUVY7O0FBRUQsZUFBTyxTQUFTLEdBQWhCLE1BQUE7QUFiRixPQUFBLE1BY08sSUFBSSxRQUFRLEtBQUssQ0FBakIsQ0FBQSxFQUFxQjtBQUMxQixlQUFBLENBQUE7QUFESyxPQUFBLE1BRUE7QUFDTCxRQUFBLFNBQVMsSUFBVCxDQUFBO0FBQ0EsUUFBQSxTQUFTLEdBQUcsUUFBUSxHQUFwQixDQUFBO0FBQ0Q7QUFDRjtBQUNGOztBQWxGZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2Vudic7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmltcG9ydCB7IFNvdXJjZUxvY2F0aW9uLCBTb3VyY2VQb3NpdGlvbiB9IGZyb20gJy4vbG9jYXRpb24nO1xuaW1wb3J0IHsgU291cmNlT2Zmc2V0LCBTb3VyY2VTcGFuIH0gZnJvbSAnLi9zcGFuJztcblxuZXhwb3J0IGNsYXNzIFNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nLCByZWFkb25seSBtb2R1bGU6IHN0cmluZyA9ICdhbiB1bmtub3duIG1vZHVsZScpIHt9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgdGhlIGNoYXJhY3RlciBvZmZzZXQgcmVwcmVzZW50cyBhIHBvc2l0aW9uIGluIHRoZSBzb3VyY2Ugc3RyaW5nLlxuICAgKi9cbiAgY2hlY2sob2Zmc2V0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gb2Zmc2V0ID49IDAgJiYgb2Zmc2V0IDw9IHRoaXMuc291cmNlLmxlbmd0aDtcbiAgfVxuXG4gIHNsaWNlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBvZmZzZXRGb3IobGluZTogbnVtYmVyLCBjb2x1bW46IG51bWJlcik6IFNvdXJjZU9mZnNldCB7XG4gICAgcmV0dXJuIFNvdXJjZU9mZnNldC5mb3JIYnNQb3ModGhpcywgeyBsaW5lLCBjb2x1bW4gfSk7XG4gIH1cblxuICBzcGFuRm9yKHsgc3RhcnQsIGVuZCB9OiBSZWFkb25seTxTb3VyY2VMb2NhdGlvbj4pOiBTb3VyY2VTcGFuIHtcbiAgICByZXR1cm4gU291cmNlU3Bhbi5mb3JIYnNMb2ModGhpcywge1xuICAgICAgc3RhcnQ6IHsgbGluZTogc3RhcnQubGluZSwgY29sdW1uOiBzdGFydC5jb2x1bW4gfSxcbiAgICAgIGVuZDogeyBsaW5lOiBlbmQubGluZSwgY29sdW1uOiBlbmQuY29sdW1uIH0sXG4gICAgfSk7XG4gIH1cblxuICBoYnNQb3NGb3Iob2Zmc2V0OiBudW1iZXIpOiBPcHRpb248U291cmNlUG9zaXRpb24+IHtcbiAgICBsZXQgc2VlbkxpbmVzID0gMDtcbiAgICBsZXQgc2VlbkNoYXJzID0gMDtcblxuICAgIGlmIChvZmZzZXQgPiB0aGlzLnNvdXJjZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBsZXQgbmV4dExpbmUgPSB0aGlzLnNvdXJjZS5pbmRleE9mKCdcXG4nLCBzZWVuQ2hhcnMpO1xuXG4gICAgICBpZiAob2Zmc2V0IDw9IG5leHRMaW5lIHx8IG5leHRMaW5lID09PSAtMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHNlZW5MaW5lcyArIDEsXG4gICAgICAgICAgY29sdW1uOiBvZmZzZXQgLSBzZWVuQ2hhcnMsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWVuTGluZXMgKz0gMTtcbiAgICAgICAgc2VlbkNoYXJzID0gbmV4dExpbmUgKyAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoYXJQb3NGb3IocG9zaXRpb246IFNvdXJjZVBvc2l0aW9uKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgbGV0IHsgbGluZSwgY29sdW1uIH0gPSBwb3NpdGlvbjtcbiAgICBsZXQgc291cmNlU3RyaW5nID0gdGhpcy5zb3VyY2U7XG4gICAgbGV0IHNvdXJjZUxlbmd0aCA9IHNvdXJjZVN0cmluZy5sZW5ndGg7XG4gICAgbGV0IHNlZW5MaW5lcyA9IDA7XG4gICAgbGV0IHNlZW5DaGFycyA9IDA7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHNlZW5DaGFycyA+PSBzb3VyY2VMZW5ndGgpIHJldHVybiBzb3VyY2VMZW5ndGg7XG5cbiAgICAgIGxldCBuZXh0TGluZSA9IHRoaXMuc291cmNlLmluZGV4T2YoJ1xcbicsIHNlZW5DaGFycyk7XG4gICAgICBpZiAobmV4dExpbmUgPT09IC0xKSBuZXh0TGluZSA9IHRoaXMuc291cmNlLmxlbmd0aDtcblxuICAgICAgaWYgKHNlZW5MaW5lcyA9PT0gbGluZSAtIDEpIHtcbiAgICAgICAgaWYgKHNlZW5DaGFycyArIGNvbHVtbiA+IG5leHRMaW5lKSByZXR1cm4gbmV4dExpbmU7XG5cbiAgICAgICAgaWYgKERFQlVHKSB7XG4gICAgICAgICAgbGV0IHJvdW5kVHJpcCA9IHRoaXMuaGJzUG9zRm9yKHNlZW5DaGFycyArIGNvbHVtbik7XG4gICAgICAgICAgYXNzZXJ0KHJvdW5kVHJpcCAhPT0gbnVsbCwgYHRoZSByZXR1cm5lZCBvZmZzZXQgZmFpbGVkIHRvIHJvdW5kLXRyaXBgKTtcbiAgICAgICAgICBhc3NlcnQocm91bmRUcmlwLmxpbmUgPT09IGxpbmUsIGB0aGUgcm91bmQtdHJpcHBlZCBsaW5lIGRpZG4ndCBtYXRjaCB0aGUgb3JpZ2luYWwgbGluZWApO1xuICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgIHJvdW5kVHJpcC5jb2x1bW4gPT09IGNvbHVtbixcbiAgICAgICAgICAgIGB0aGUgcm91bmQtdHJpcHBlZCBjb2x1bW4gZGlkbid0IG1hdGNoIHRoZSBvcmlnaW5hbCBjb2x1bW5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWVuQ2hhcnMgKyBjb2x1bW47XG4gICAgICB9IGVsc2UgaWYgKG5leHRMaW5lID09PSAtMSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlZW5MaW5lcyArPSAxO1xuICAgICAgICBzZWVuQ2hhcnMgPSBuZXh0TGluZSArIDE7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9