@volar/source-map
Advanced tools
@@ -18,3 +18,3 @@ type CodeRangeKey = 'sourceOffsets' | 'generatedOffsets'; | ||
| toGeneratedLocation(sourceOffset: number, filter?: (data: Data) => boolean): Generator<readonly [number, Mapping<Data>], void, unknown>; | ||
| findMatchingOffsets(offset: number, fromRange: CodeRangeKey, filter?: (data: Data) => boolean): Generator<readonly [number, Mapping<Data>], void, unknown>; | ||
| findMatchingOffsets(offset: number, fromRange: CodeRangeKey, filter?: (data: Data) => boolean, preferEnd?: boolean): Generator<readonly [number, Mapping<Data>], void, unknown>; | ||
| findMatchingStartEnd(start: number, end: number, fallbackToAnyMatch: boolean, fromRange: CodeRangeKey, filter?: (data: Data) => boolean): Generator<[mappedStart: number, mappedEnd: number, startMapping: Mapping<Data>, endMapping: Mapping<Data>]>; | ||
@@ -21,0 +21,0 @@ private getMemoBasedOnRange; |
+5
-4
@@ -22,3 +22,3 @@ "use strict"; | ||
| } | ||
| *findMatchingOffsets(offset, fromRange, filter) { | ||
| *findMatchingOffsets(offset, fromRange, filter, preferEnd = false) { | ||
| const memo = this.getMemoBasedOnRange(fromRange); | ||
@@ -40,3 +40,3 @@ if (memo.offsets.length === 0) { | ||
| } | ||
| const mapped = (0, translateOffset_1.translateOffset)(offset, mapping[fromRange], mapping[toRange], getLengths(mapping, fromRange), getLengths(mapping, toRange)); | ||
| const mapped = (0, translateOffset_1.translateOffset)(offset, mapping[fromRange], mapping[toRange], getLengths(mapping, fromRange), getLengths(mapping, toRange), preferEnd); | ||
| if (mapped !== undefined) { | ||
@@ -50,2 +50,3 @@ yield [mapped, mapping]; | ||
| const toRange = fromRange === 'sourceOffsets' ? 'generatedOffsets' : 'sourceOffsets'; | ||
| const preferEnd = toRange === 'sourceOffsets'; | ||
| const mappedStarts = []; | ||
@@ -58,3 +59,3 @@ let hadMatch = false; | ||
| mappedStarts.push([mappedStart, mapping]); | ||
| const mappedEnd = (0, translateOffset_1.translateOffset)(end, mapping[fromRange], mapping[toRange], getLengths(mapping, fromRange), getLengths(mapping, toRange)); | ||
| const mappedEnd = (0, translateOffset_1.translateOffset)(end, mapping[fromRange], mapping[toRange], getLengths(mapping, fromRange), getLengths(mapping, toRange), preferEnd); | ||
| if (mappedEnd !== undefined) { | ||
@@ -67,3 +68,3 @@ hadMatch = true; | ||
| for (const [mappedStart, mappingStart] of mappedStarts) { | ||
| for (const [mappedEnd, mappingEnd] of this.findMatchingOffsets(end, fromRange)) { | ||
| for (const [mappedEnd, mappingEnd] of this.findMatchingOffsets(end, fromRange, undefined, preferEnd)) { | ||
| if (filter && !filter(mappingEnd.data) || mappedEnd < mappedStart) { | ||
@@ -70,0 +71,0 @@ continue; |
@@ -1,1 +0,1 @@ | ||
| export declare function translateOffset(start: number, fromOffsets: number[], toOffsets: number[], fromLengths: number[], toLengths?: number[]): number | undefined; | ||
| export declare function translateOffset(start: number, fromOffsets: number[], toOffsets: number[], fromLengths: number[], toLengths?: number[], preferEnd?: boolean): number | undefined; |
@@ -5,3 +5,3 @@ "use strict"; | ||
| let warned = false; | ||
| function translateOffset(start, fromOffsets, toOffsets, fromLengths, toLengths = fromLengths) { | ||
| function translateOffset(start, fromOffsets, toOffsets, fromLengths, toLengths = fromLengths, preferEnd = false) { | ||
| const isSorted = fromOffsets.every((value, index) => index === 0 || fromOffsets[index - 1] <= value); | ||
@@ -15,3 +15,10 @@ if (!isSorted) { | ||
| const toOffset = toOffsets[i]; | ||
| let rangeOffset = Math.min(start - fromOffset, toLength); | ||
| let rangeOffset; | ||
| const relativePos = start - fromOffset; | ||
| if (preferEnd && toLength > fromLength && relativePos === fromLength) { | ||
| rangeOffset = toLength; | ||
| } | ||
| else { | ||
| rangeOffset = Math.min(relativePos, toLength); | ||
| } | ||
| return toOffset + rangeOffset; | ||
@@ -34,3 +41,10 @@ } | ||
| const toOffset = toOffsets[mid]; | ||
| let rangeOffset = Math.min(start - fromOffset, toLength); | ||
| let rangeOffset; | ||
| const relativePos = start - fromOffset; | ||
| if (preferEnd && toLength > fromLength && relativePos === fromLength) { | ||
| rangeOffset = toLength; | ||
| } | ||
| else { | ||
| rangeOffset = Math.min(relativePos, toLength); | ||
| } | ||
| return toOffset + rangeOffset; | ||
@@ -37,0 +51,0 @@ } |
+3
-2
| { | ||
| "name": "@volar/source-map", | ||
| "version": "2.4.27", | ||
| "version": "2.4.28", | ||
| "license": "MIT", | ||
@@ -13,3 +13,4 @@ "files": [ | ||
| "directory": "packages/source-map" | ||
| } | ||
| }, | ||
| "gitHead": "882cd56d46a13d272f34e451f495d3d62251969a" | ||
| } |
14490
5.48%236
6.79%