source.js 9.8 KB

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