Skip to content

Commit 3f315ed

Browse files
committed
Deliver events only if sampled lines are affected
1 parent 4e26835 commit 3f315ed

1 file changed

Lines changed: 36 additions & 13 deletions

File tree

src/vs/editor/browser/viewParts/minimap/minimap.ts

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -562,15 +562,12 @@ export class Minimap extends ViewPart implements IMinimapModel {
562562
}
563563
public onLinesChanged(e: viewEvents.ViewLinesChangedEvent): boolean {
564564
if (this._isSampling) {
565-
let fromLineIndex = this._modelLineToMinimapLine(e.fromLineNumber) - 1;
566-
while (fromLineIndex > 0 && this._minimapLines[fromLineIndex - 1] >= e.fromLineNumber) {
567-
fromLineIndex--;
568-
}
569-
let toLineIndex = this._modelLineToMinimapLine(e.toLineNumber) - 1;
570-
while (toLineIndex + 1 < this._minimapLines.length && this._minimapLines[toLineIndex + 1] <= e.toLineNumber) {
571-
toLineIndex++;
565+
const minimapLineRange = this._modelLineRangeToMinimapLineRange(e.fromLineNumber, e.toLineNumber);
566+
if (minimapLineRange) {
567+
return this._actual.onLinesChanged(minimapLineRange[0], minimapLineRange[1]);
568+
} else {
569+
return false;
572570
}
573-
return this._actual.onLinesChanged(fromLineIndex + 1, toLineIndex + 1);
574571
} else {
575572
return this._actual.onLinesChanged(e.fromLineNumber, e.toLineNumber);
576573
}
@@ -630,12 +627,16 @@ export class Minimap extends ViewPart implements IMinimapModel {
630627
if (this._isSampling) {
631628
let ranges: { fromLineNumber: number; toLineNumber: number; }[] = [];
632629
for (const range of e.ranges) {
633-
ranges.push({
634-
fromLineNumber: this._modelLineToMinimapLine(range.fromLineNumber),
635-
toLineNumber: this._modelLineToMinimapLine(range.toLineNumber)
636-
});
630+
const minimapLineRange = this._modelLineRangeToMinimapLineRange(range.fromLineNumber, range.toLineNumber);
631+
if (minimapLineRange) {
632+
ranges.push({ fromLineNumber: minimapLineRange[0], toLineNumber: minimapLineRange[1] });
633+
}
634+
}
635+
if (ranges.length) {
636+
return this._actual.onTokensChanged(ranges);
637+
} else {
638+
return false;
637639
}
638-
return this._actual.onTokensChanged(ranges);
639640
} else {
640641
return this._actual.onTokensChanged(e.ranges);
641642
}
@@ -715,6 +716,28 @@ export class Minimap extends ViewPart implements IMinimapModel {
715716
return Math.min(this._minimapLines.length, Math.max(1, Math.round(lineNumber / this._samplingRatio)));
716717
}
717718

719+
/**
720+
* Will return null if the model line ranges are not intersecting with a sampled model line.
721+
*/
722+
private _modelLineRangeToMinimapLineRange(fromLineNumber: number, toLineNumber: number): [number, number] | null {
723+
let fromLineIndex = this._modelLineToMinimapLine(fromLineNumber) - 1;
724+
while (fromLineIndex > 0 && this._minimapLines[fromLineIndex - 1] >= fromLineNumber) {
725+
fromLineIndex--;
726+
}
727+
let toLineIndex = this._modelLineToMinimapLine(toLineNumber) - 1;
728+
while (toLineIndex + 1 < this._minimapLines.length && this._minimapLines[toLineIndex + 1] <= toLineNumber) {
729+
toLineIndex++;
730+
}
731+
if (fromLineIndex === toLineIndex) {
732+
const sampledLineNumber = this._minimapLines[fromLineIndex];
733+
if (sampledLineNumber < fromLineNumber || sampledLineNumber > toLineNumber) {
734+
// This line is not part of the sampled lines ==> nothing to do
735+
return null;
736+
}
737+
}
738+
return [fromLineIndex + 1, toLineIndex + 1];
739+
}
740+
718741
private _recomputeMinimapSelections(): void {
719742
this._minimapSelections = [];
720743
for (const selection of this._selections) {

0 commit comments

Comments
 (0)