74 lines
2.9 KiB
Plaintext
74 lines
2.9 KiB
Plaintext
"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;
|
|
}
|
|
getSourceOffset(generatedOffset) {
|
|
for (const mapped of this.findMatching(generatedOffset, 'generatedOffsets', 'sourceOffsets')) {
|
|
return mapped;
|
|
}
|
|
}
|
|
getGeneratedOffset(sourceOffset) {
|
|
for (const mapped of this.findMatching(sourceOffset, 'sourceOffsets', 'generatedOffsets')) {
|
|
return mapped;
|
|
}
|
|
}
|
|
getSourceOffsets(generatedOffset) {
|
|
return this.findMatching(generatedOffset, 'generatedOffsets', 'sourceOffsets');
|
|
}
|
|
getGeneratedOffsets(sourceOffset) {
|
|
return this.findMatching(sourceOffset, 'sourceOffsets', 'generatedOffsets');
|
|
}
|
|
*findMatching(offset, fromRange, toRange) {
|
|
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();
|
|
for (let i = start; i <= end; i++) {
|
|
for (const mapping of memo.mappings[i]) {
|
|
if (skip.has(mapping)) {
|
|
continue;
|
|
}
|
|
skip.add(mapping);
|
|
const mapped = (0, translateOffset_1.translateOffset)(offset, mapping[fromRange], mapping[toRange], mapping.lengths);
|
|
if (mapped !== undefined) {
|
|
yield [mapped, mapping];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
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] + mapping.lengths[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] + mapping.lengths[i]).match;
|
|
for (let i = startIndex; i <= endIndex; i++) {
|
|
mappings[i].add(mapping);
|
|
}
|
|
}
|
|
}
|
|
return { offsets, mappings };
|
|
}
|
|
}
|
|
exports.SourceMap = SourceMap;
|
|
//# sourceMappingURL=sourceMap.js.map |