sourceMap.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.SourceMap = void 0;
  4. const binarySearch_1 = require("./binarySearch");
  5. const translateOffset_1 = require("./translateOffset");
  6. class SourceMap {
  7. constructor(mappings) {
  8. this.mappings = mappings;
  9. }
  10. toSourceRange(generatedStart, generatedEnd, fallbackToAnyMatch, filter) {
  11. return this.findMatchingStartEnd(generatedStart, generatedEnd, fallbackToAnyMatch, 'generatedOffsets', filter);
  12. }
  13. toGeneratedRange(sourceStart, sourceEnd, fallbackToAnyMatch, filter) {
  14. return this.findMatchingStartEnd(sourceStart, sourceEnd, fallbackToAnyMatch, 'sourceOffsets', filter);
  15. }
  16. toSourceLocation(generatedOffset, filter) {
  17. return this.findMatchingOffsets(generatedOffset, 'generatedOffsets', filter);
  18. }
  19. toGeneratedLocation(sourceOffset, filter) {
  20. return this.findMatchingOffsets(sourceOffset, 'sourceOffsets', filter);
  21. }
  22. *findMatchingOffsets(offset, fromRange, filter) {
  23. const memo = this.getMemoBasedOnRange(fromRange);
  24. if (memo.offsets.length === 0) {
  25. return;
  26. }
  27. const { low: start, high: end } = (0, binarySearch_1.binarySearch)(memo.offsets, offset);
  28. const skip = new Set();
  29. const toRange = fromRange == 'sourceOffsets' ? 'generatedOffsets' : 'sourceOffsets';
  30. for (let i = start; i <= end; i++) {
  31. for (const mapping of memo.mappings[i]) {
  32. if (skip.has(mapping)) {
  33. continue;
  34. }
  35. skip.add(mapping);
  36. if (filter && !filter(mapping.data)) {
  37. continue;
  38. }
  39. const mapped = (0, translateOffset_1.translateOffset)(offset, mapping[fromRange], mapping[toRange], getLengths(mapping, fromRange), getLengths(mapping, toRange));
  40. if (mapped !== undefined) {
  41. yield [mapped, mapping];
  42. }
  43. }
  44. }
  45. }
  46. *findMatchingStartEnd(start, end, fallbackToAnyMatch, fromRange, filter) {
  47. const toRange = fromRange == 'sourceOffsets' ? 'generatedOffsets' : 'sourceOffsets';
  48. const mappedStarts = [];
  49. let hadMatch = false;
  50. for (const [mappedStart, mapping] of this.findMatchingOffsets(start, fromRange)) {
  51. if (filter && !filter(mapping.data)) {
  52. continue;
  53. }
  54. mappedStarts.push([mappedStart, mapping]);
  55. const mappedEnd = (0, translateOffset_1.translateOffset)(end, mapping[fromRange], mapping[toRange], getLengths(mapping, fromRange), getLengths(mapping, toRange));
  56. if (mappedEnd !== undefined) {
  57. hadMatch = true;
  58. yield [mappedStart, mappedEnd, mapping, mapping];
  59. }
  60. }
  61. if (!hadMatch && fallbackToAnyMatch) {
  62. for (const [mappedStart, mappingStart] of mappedStarts) {
  63. for (const [mappedEnd, mappingEnd] of this.findMatchingOffsets(end, fromRange)) {
  64. if (filter && !filter(mappingEnd.data) || mappedEnd < mappedStart) {
  65. continue;
  66. }
  67. yield [mappedStart, mappedEnd, mappingStart, mappingEnd];
  68. break;
  69. }
  70. ;
  71. }
  72. }
  73. }
  74. getMemoBasedOnRange(fromRange) {
  75. return fromRange === 'sourceOffsets'
  76. ? this.sourceCodeOffsetsMemo ??= this.createMemo('sourceOffsets')
  77. : this.generatedCodeOffsetsMemo ??= this.createMemo('generatedOffsets');
  78. }
  79. createMemo(key) {
  80. const offsetsSet = new Set();
  81. for (const mapping of this.mappings) {
  82. for (let i = 0; i < mapping[key].length; i++) {
  83. offsetsSet.add(mapping[key][i]);
  84. offsetsSet.add(mapping[key][i] + getLengths(mapping, key)[i]);
  85. }
  86. }
  87. const offsets = [...offsetsSet].sort((a, b) => a - b);
  88. const mappings = offsets.map(() => new Set());
  89. for (const mapping of this.mappings) {
  90. for (let i = 0; i < mapping[key].length; i++) {
  91. const startIndex = (0, binarySearch_1.binarySearch)(offsets, mapping[key][i]).match;
  92. const endIndex = (0, binarySearch_1.binarySearch)(offsets, mapping[key][i] + getLengths(mapping, key)[i]).match;
  93. for (let i = startIndex; i <= endIndex; i++) {
  94. mappings[i].add(mapping);
  95. }
  96. }
  97. }
  98. return { offsets, mappings };
  99. }
  100. }
  101. exports.SourceMap = SourceMap;
  102. function getLengths(mapping, key) {
  103. return key == 'sourceOffsets' ? mapping.lengths : mapping.generatedLengths ?? mapping.lengths;
  104. }
  105. //# sourceMappingURL=sourceMap.js.map