105 lines
4.7 KiB
JavaScript
105 lines
4.7 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.SourceMap = void 0;
|
|
const binarySearch_1 = require("./binarySearch");
|
|
const translateOffset_1 = require("./translateOffset");
|
|
class SourceMap {
|
|
constructor(mappings) {
|
|
this.mappings = mappings;
|
|
}
|
|
toSourceRange(generatedStart, generatedEnd, fallbackToAnyMatch, filter) {
|
|
return this.findMatchingStartEnd(generatedStart, generatedEnd, fallbackToAnyMatch, 'generatedOffsets', filter);
|
|
}
|
|
toGeneratedRange(sourceStart, sourceEnd, fallbackToAnyMatch, filter) {
|
|
return this.findMatchingStartEnd(sourceStart, sourceEnd, fallbackToAnyMatch, 'sourceOffsets', filter);
|
|
}
|
|
toSourceLocation(generatedOffset, filter) {
|
|
return this.findMatchingOffsets(generatedOffset, 'generatedOffsets', filter);
|
|
}
|
|
toGeneratedLocation(sourceOffset, filter) {
|
|
return this.findMatchingOffsets(sourceOffset, 'sourceOffsets', filter);
|
|
}
|
|
*findMatchingOffsets(offset, fromRange, filter) {
|
|
const memo = this.getMemoBasedOnRange(fromRange);
|
|
if (memo.offsets.length === 0) {
|
|
return;
|
|
}
|
|
const { low: start, high: end } = (0, binarySearch_1.binarySearch)(memo.offsets, offset);
|
|
const skip = new Set();
|
|
const toRange = fromRange == 'sourceOffsets' ? 'generatedOffsets' : 'sourceOffsets';
|
|
for (let i = start; i <= end; i++) {
|
|
for (const mapping of memo.mappings[i]) {
|
|
if (skip.has(mapping)) {
|
|
continue;
|
|
}
|
|
skip.add(mapping);
|
|
if (filter && !filter(mapping.data)) {
|
|
continue;
|
|
}
|
|
const mapped = (0, translateOffset_1.translateOffset)(offset, mapping[fromRange], mapping[toRange], getLengths(mapping, fromRange), getLengths(mapping, toRange));
|
|
if (mapped !== undefined) {
|
|
yield [mapped, mapping];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
*findMatchingStartEnd(start, end, fallbackToAnyMatch, fromRange, filter) {
|
|
const toRange = fromRange == 'sourceOffsets' ? 'generatedOffsets' : 'sourceOffsets';
|
|
const mappedStarts = [];
|
|
let hadMatch = false;
|
|
for (const [mappedStart, mapping] of this.findMatchingOffsets(start, fromRange)) {
|
|
if (filter && !filter(mapping.data)) {
|
|
continue;
|
|
}
|
|
mappedStarts.push([mappedStart, mapping]);
|
|
const mappedEnd = (0, translateOffset_1.translateOffset)(end, mapping[fromRange], mapping[toRange], getLengths(mapping, fromRange), getLengths(mapping, toRange));
|
|
if (mappedEnd !== undefined) {
|
|
hadMatch = true;
|
|
yield [mappedStart, mappedEnd, mapping, mapping];
|
|
}
|
|
}
|
|
if (!hadMatch && fallbackToAnyMatch) {
|
|
for (const [mappedStart, mappingStart] of mappedStarts) {
|
|
for (const [mappedEnd, mappingEnd] of this.findMatchingOffsets(end, fromRange)) {
|
|
if (filter && !filter(mappingEnd.data) || mappedEnd < mappedStart) {
|
|
continue;
|
|
}
|
|
yield [mappedStart, mappedEnd, mappingStart, mappingEnd];
|
|
break;
|
|
}
|
|
;
|
|
}
|
|
}
|
|
}
|
|
getMemoBasedOnRange(fromRange) {
|
|
return fromRange === 'sourceOffsets'
|
|
? this.sourceCodeOffsetsMemo ??= this.createMemo('sourceOffsets')
|
|
: this.generatedCodeOffsetsMemo ??= this.createMemo('generatedOffsets');
|
|
}
|
|
createMemo(key) {
|
|
const offsetsSet = new Set();
|
|
for (const mapping of this.mappings) {
|
|
for (let i = 0; i < mapping[key].length; i++) {
|
|
offsetsSet.add(mapping[key][i]);
|
|
offsetsSet.add(mapping[key][i] + getLengths(mapping, key)[i]);
|
|
}
|
|
}
|
|
const offsets = [...offsetsSet].sort((a, b) => a - b);
|
|
const mappings = offsets.map(() => new Set());
|
|
for (const mapping of this.mappings) {
|
|
for (let i = 0; i < mapping[key].length; i++) {
|
|
const startIndex = (0, binarySearch_1.binarySearch)(offsets, mapping[key][i]).match;
|
|
const endIndex = (0, binarySearch_1.binarySearch)(offsets, mapping[key][i] + getLengths(mapping, key)[i]).match;
|
|
for (let i = startIndex; i <= endIndex; i++) {
|
|
mappings[i].add(mapping);
|
|
}
|
|
}
|
|
}
|
|
return { offsets, mappings };
|
|
}
|
|
}
|
|
exports.SourceMap = SourceMap;
|
|
function getLengths(mapping, key) {
|
|
return key == 'sourceOffsets' ? mapping.lengths : mapping.generatedLengths ?? mapping.lengths;
|
|
}
|
|
//# sourceMappingURL=sourceMap.js.map
|