@@ -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