"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Source = void 0; var _env = require("@glimmer/env"); var _util = require("@glimmer/util"); var _span = require("./span"); // eslint-disable-next-line import/no-extraneous-dependencies class Source { constructor(source, module = 'an unknown module') { this.source = source; this.module = module; } /** * Validate that the character offset represents a position in the source string. */ check(offset) { return offset >= 0 && offset <= this.source.length; } slice(start, end) { return this.source.slice(start, end); } offsetFor(line, column) { return _span.SourceOffset.forHbsPos(this, { line, column }); } spanFor({ start, end }) { return _span.SourceSpan.forHbsLoc(this, { start: { line: start.line, column: start.column }, end: { line: end.line, column: end.column } }); } hbsPosFor(offset) { let seenLines = 0; let seenChars = 0; if (offset > this.source.length) { return null; } while (true) { let nextLine = this.source.indexOf('\n', seenChars); if (offset <= nextLine || nextLine === -1) { return { line: seenLines + 1, column: offset - seenChars }; } else { seenLines += 1; seenChars = nextLine + 1; } } } charPosFor(position) { let { line, column } = position; let sourceString = this.source; let sourceLength = sourceString.length; let seenLines = 0; let seenChars = 0; while (true) { if (seenChars >= sourceLength) return sourceLength; let nextLine = this.source.indexOf('\n', seenChars); if (nextLine === -1) nextLine = this.source.length; if (seenLines === line - 1) { if (seenChars + column > nextLine) return nextLine; if (_env.DEBUG) { let roundTrip = this.hbsPosFor(seenChars + column); false && (0, _util.assert)(roundTrip !== null, `the returned offset failed to round-trip`); false && (0, _util.assert)(roundTrip.line === line, `the round-tripped line didn't match the original line`); false && (0, _util.assert)(roundTrip.column === column, `the round-tripped column didn't match the original column`); } return seenChars + column; } else if (nextLine === -1) { return 0; } else { seenLines += 1; seenChars = nextLine + 1; } } } } exports.Source = Source; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvc291cmNlL3NvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7O0FBRUE7O0FBR0E7O0FBTkE7QUFRTSxNQUFBLE1BQUEsQ0FBYTtBQUNqQixFQUFBLFdBQUEsQ0FBQSxNQUFBLEVBQThDLE1BQUEsR0FBOUMsbUJBQUEsRUFBa0Y7QUFBN0QsU0FBQSxNQUFBLEdBQUEsTUFBQTtBQUF5QixTQUFBLE1BQUEsR0FBQSxNQUFBO0FBQXdDO0FBRXRGOzs7OztBQUdBLEVBQUEsS0FBSyxDQUFBLE1BQUEsRUFBZTtBQUNsQixXQUFPLE1BQU0sSUFBTixDQUFBLElBQWUsTUFBTSxJQUFJLEtBQUEsTUFBQSxDQUFoQyxNQUFBO0FBQ0Q7O0FBRUQsRUFBQSxLQUFLLENBQUEsS0FBQSxFQUFBLEdBQUEsRUFBMkI7QUFDOUIsV0FBTyxLQUFBLE1BQUEsQ0FBQSxLQUFBLENBQUEsS0FBQSxFQUFQLEdBQU8sQ0FBUDtBQUNEOztBQUVELEVBQUEsU0FBUyxDQUFBLElBQUEsRUFBQSxNQUFBLEVBQTZCO0FBQ3BDLFdBQU8sbUJBQUEsU0FBQSxDQUFBLElBQUEsRUFBNkI7QUFBQSxNQUFBLElBQUE7QUFBUSxNQUFBO0FBQVIsS0FBN0IsQ0FBUDtBQUNEOztBQUVELEVBQUEsT0FBTyxDQUFDO0FBQUEsSUFBQSxLQUFBO0FBQVMsSUFBQTtBQUFULEdBQUQsRUFBeUM7QUFDOUMsV0FBTyxpQkFBQSxTQUFBLENBQUEsSUFBQSxFQUEyQjtBQUNoQyxNQUFBLEtBQUssRUFBRTtBQUFFLFFBQUEsSUFBSSxFQUFFLEtBQUssQ0FBYixJQUFBO0FBQW9CLFFBQUEsTUFBTSxFQUFFLEtBQUssQ0FBQztBQUFsQyxPQUR5QjtBQUVoQyxNQUFBLEdBQUcsRUFBRTtBQUFFLFFBQUEsSUFBSSxFQUFFLEdBQUcsQ0FBWCxJQUFBO0FBQWtCLFFBQUEsTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUE5QjtBQUYyQixLQUEzQixDQUFQO0FBSUQ7O0FBRUQsRUFBQSxTQUFTLENBQUEsTUFBQSxFQUFlO0FBQ3RCLFFBQUksU0FBUyxHQUFiLENBQUE7QUFDQSxRQUFJLFNBQVMsR0FBYixDQUFBOztBQUVBLFFBQUksTUFBTSxHQUFHLEtBQUEsTUFBQSxDQUFiLE1BQUEsRUFBaUM7QUFDL0IsYUFBQSxJQUFBO0FBQ0Q7O0FBRUQsV0FBQSxJQUFBLEVBQWE7QUFDWCxVQUFJLFFBQVEsR0FBRyxLQUFBLE1BQUEsQ0FBQSxPQUFBLENBQUEsSUFBQSxFQUFmLFNBQWUsQ0FBZjs7QUFFQSxVQUFJLE1BQU0sSUFBTixRQUFBLElBQXNCLFFBQVEsS0FBSyxDQUF2QyxDQUFBLEVBQTJDO0FBQ3pDLGVBQU87QUFDTCxVQUFBLElBQUksRUFBRSxTQUFTLEdBRFYsQ0FBQTtBQUVMLFVBQUEsTUFBTSxFQUFFLE1BQU0sR0FBRztBQUZaLFNBQVA7QUFERixPQUFBLE1BS087QUFDTCxRQUFBLFNBQVMsSUFBVCxDQUFBO0FBQ0EsUUFBQSxTQUFTLEdBQUcsUUFBUSxHQUFwQixDQUFBO0FBQ0Q7QUFDRjtBQUNGOztBQUVELEVBQUEsVUFBVSxDQUFBLFFBQUEsRUFBeUI7QUFDakMsUUFBSTtBQUFBLE1BQUEsSUFBQTtBQUFRLE1BQUE7QUFBUixRQUFKLFFBQUE7QUFDQSxRQUFJLFlBQVksR0FBRyxLQUFuQixNQUFBO0FBQ0EsUUFBSSxZQUFZLEdBQUcsWUFBWSxDQUEvQixNQUFBO0FBQ0EsUUFBSSxTQUFTLEdBQWIsQ0FBQTtBQUNBLFFBQUksU0FBUyxHQUFiLENBQUE7O0FBRUEsV0FBQSxJQUFBLEVBQWE7QUFDWCxVQUFJLFNBQVMsSUFBYixZQUFBLEVBQStCLE9BQUEsWUFBQTtBQUUvQixVQUFJLFFBQVEsR0FBRyxLQUFBLE1BQUEsQ0FBQSxPQUFBLENBQUEsSUFBQSxFQUFmLFNBQWUsQ0FBZjtBQUNBLFVBQUksUUFBUSxLQUFLLENBQWpCLENBQUEsRUFBcUIsUUFBUSxHQUFHLEtBQUEsTUFBQSxDQUFYLE1BQUE7O0FBRXJCLFVBQUksU0FBUyxLQUFLLElBQUksR0FBdEIsQ0FBQSxFQUE0QjtBQUMxQixZQUFJLFNBQVMsR0FBVCxNQUFBLEdBQUosUUFBQSxFQUFtQyxPQUFBLFFBQUE7O0FBRW5DLFlBQUEsVUFBQSxFQUFXO0FBQ1QsY0FBSSxTQUFTLEdBQUcsS0FBQSxTQUFBLENBQWUsU0FBUyxHQUF4QyxNQUFnQixDQUFoQjtBQURTLG1CQUVULGtCQUFPLFNBQVMsS0FBVixJQUFOLEVBRlMsMENBRVQsQ0FGUztBQUFBLG1CQUdULGtCQUFPLFNBQVMsQ0FBVCxJQUFBLEtBQUQsSUFBTixFQUhTLHVEQUdULENBSFM7QUFBQSxtQkFJVCxrQkFDRSxTQUFTLENBQVQsTUFBQSxLQURJLE1BQU4sRUFKUywyREFJVCxDQUpTO0FBUVY7O0FBRUQsZUFBTyxTQUFTLEdBQWhCLE1BQUE7QUFiRixPQUFBLE1BY08sSUFBSSxRQUFRLEtBQUssQ0FBakIsQ0FBQSxFQUFxQjtBQUMxQixlQUFBLENBQUE7QUFESyxPQUFBLE1BRUE7QUFDTCxRQUFBLFNBQVMsSUFBVCxDQUFBO0FBQ0EsUUFBQSxTQUFTLEdBQUcsUUFBUSxHQUFwQixDQUFBO0FBQ0Q7QUFDRjtBQUNGOztBQWxGZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2Vudic7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmltcG9ydCB7IFNvdXJjZUxvY2F0aW9uLCBTb3VyY2VQb3NpdGlvbiB9IGZyb20gJy4vbG9jYXRpb24nO1xuaW1wb3J0IHsgU291cmNlT2Zmc2V0LCBTb3VyY2VTcGFuIH0gZnJvbSAnLi9zcGFuJztcblxuZXhwb3J0IGNsYXNzIFNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nLCByZWFkb25seSBtb2R1bGU6IHN0cmluZyA9ICdhbiB1bmtub3duIG1vZHVsZScpIHt9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgdGhlIGNoYXJhY3RlciBvZmZzZXQgcmVwcmVzZW50cyBhIHBvc2l0aW9uIGluIHRoZSBzb3VyY2Ugc3RyaW5nLlxuICAgKi9cbiAgY2hlY2sob2Zmc2V0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gb2Zmc2V0ID49IDAgJiYgb2Zmc2V0IDw9IHRoaXMuc291cmNlLmxlbmd0aDtcbiAgfVxuXG4gIHNsaWNlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBvZmZzZXRGb3IobGluZTogbnVtYmVyLCBjb2x1bW46IG51bWJlcik6IFNvdXJjZU9mZnNldCB7XG4gICAgcmV0dXJuIFNvdXJjZU9mZnNldC5mb3JIYnNQb3ModGhpcywgeyBsaW5lLCBjb2x1bW4gfSk7XG4gIH1cblxuICBzcGFuRm9yKHsgc3RhcnQsIGVuZCB9OiBSZWFkb25seTxTb3VyY2VMb2NhdGlvbj4pOiBTb3VyY2VTcGFuIHtcbiAgICByZXR1cm4gU291cmNlU3Bhbi5mb3JIYnNMb2ModGhpcywge1xuICAgICAgc3RhcnQ6IHsgbGluZTogc3RhcnQubGluZSwgY29sdW1uOiBzdGFydC5jb2x1bW4gfSxcbiAgICAgIGVuZDogeyBsaW5lOiBlbmQubGluZSwgY29sdW1uOiBlbmQuY29sdW1uIH0sXG4gICAgfSk7XG4gIH1cblxuICBoYnNQb3NGb3Iob2Zmc2V0OiBudW1iZXIpOiBPcHRpb248U291cmNlUG9zaXRpb24+IHtcbiAgICBsZXQgc2VlbkxpbmVzID0gMDtcbiAgICBsZXQgc2VlbkNoYXJzID0gMDtcblxuICAgIGlmIChvZmZzZXQgPiB0aGlzLnNvdXJjZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBsZXQgbmV4dExpbmUgPSB0aGlzLnNvdXJjZS5pbmRleE9mKCdcXG4nLCBzZWVuQ2hhcnMpO1xuXG4gICAgICBpZiAob2Zmc2V0IDw9IG5leHRMaW5lIHx8IG5leHRMaW5lID09PSAtMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHNlZW5MaW5lcyArIDEsXG4gICAgICAgICAgY29sdW1uOiBvZmZzZXQgLSBzZWVuQ2hhcnMsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWVuTGluZXMgKz0gMTtcbiAgICAgICAgc2VlbkNoYXJzID0gbmV4dExpbmUgKyAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoYXJQb3NGb3IocG9zaXRpb246IFNvdXJjZVBvc2l0aW9uKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgbGV0IHsgbGluZSwgY29sdW1uIH0gPSBwb3NpdGlvbjtcbiAgICBsZXQgc291cmNlU3RyaW5nID0gdGhpcy5zb3VyY2U7XG4gICAgbGV0IHNvdXJjZUxlbmd0aCA9IHNvdXJjZVN0cmluZy5sZW5ndGg7XG4gICAgbGV0IHNlZW5MaW5lcyA9IDA7XG4gICAgbGV0IHNlZW5DaGFycyA9IDA7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHNlZW5DaGFycyA+PSBzb3VyY2VMZW5ndGgpIHJldHVybiBzb3VyY2VMZW5ndGg7XG5cbiAgICAgIGxldCBuZXh0TGluZSA9IHRoaXMuc291cmNlLmluZGV4T2YoJ1xcbicsIHNlZW5DaGFycyk7XG4gICAgICBpZiAobmV4dExpbmUgPT09IC0xKSBuZXh0TGluZSA9IHRoaXMuc291cmNlLmxlbmd0aDtcblxuICAgICAgaWYgKHNlZW5MaW5lcyA9PT0gbGluZSAtIDEpIHtcbiAgICAgICAgaWYgKHNlZW5DaGFycyArIGNvbHVtbiA+IG5leHRMaW5lKSByZXR1cm4gbmV4dExpbmU7XG5cbiAgICAgICAgaWYgKERFQlVHKSB7XG4gICAgICAgICAgbGV0IHJvdW5kVHJpcCA9IHRoaXMuaGJzUG9zRm9yKHNlZW5DaGFycyArIGNvbHVtbik7XG4gICAgICAgICAgYXNzZXJ0KHJvdW5kVHJpcCAhPT0gbnVsbCwgYHRoZSByZXR1cm5lZCBvZmZzZXQgZmFpbGVkIHRvIHJvdW5kLXRyaXBgKTtcbiAgICAgICAgICBhc3NlcnQocm91bmRUcmlwLmxpbmUgPT09IGxpbmUsIGB0aGUgcm91bmQtdHJpcHBlZCBsaW5lIGRpZG4ndCBtYXRjaCB0aGUgb3JpZ2luYWwgbGluZWApO1xuICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgIHJvdW5kVHJpcC5jb2x1bW4gPT09IGNvbHVtbixcbiAgICAgICAgICAgIGB0aGUgcm91bmQtdHJpcHBlZCBjb2x1bW4gZGlkbid0IG1hdGNoIHRoZSBvcmlnaW5hbCBjb2x1bW5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWVuQ2hhcnMgKyBjb2x1bW47XG4gICAgICB9IGVsc2UgaWYgKG5leHRMaW5lID09PSAtMSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlZW5MaW5lcyArPSAxO1xuICAgICAgICBzZWVuQ2hhcnMgPSBuZXh0TGluZSArIDE7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9