@@ -7,7 +7,7 @@ import { $ } from 'vs/base/browser/dom';
7
7
import { ArrayQueue } from 'vs/base/common/arrays' ;
8
8
import { RunOnceScheduler } from 'vs/base/common/async' ;
9
9
import { Codicon } from 'vs/base/common/codicons' ;
10
- import { Disposable , DisposableStore } from 'vs/base/common/lifecycle' ;
10
+ import { Disposable , DisposableStore , toDisposable } from 'vs/base/common/lifecycle' ;
11
11
import { IObservable , derived , observableFromEvent , observableValue } from 'vs/base/common/observable' ;
12
12
import { autorun , autorunWithStore2 } from 'vs/base/common/observableImpl/autorun' ;
13
13
import { ThemeIcon } from 'vs/base/common/themables' ;
@@ -340,6 +340,17 @@ export class ViewZoneManager extends Disposable {
340
340
scrollState . restore ( this . _editors . modified ) ;
341
341
} ) ) ;
342
342
343
+ this . _register ( toDisposable ( ( ) => {
344
+ this . _editors . original . changeViewZones ( ( a ) => {
345
+ for ( const id of alignmentViewZoneIdsOrig ) { a . removeZone ( id ) ; }
346
+ alignmentViewZoneIdsOrig . clear ( ) ;
347
+ } ) ;
348
+ this . _editors . modified . changeViewZones ( ( a ) => {
349
+ for ( const id of alignmentViewZoneIdsMod ) { a . removeZone ( id ) ; }
350
+ alignmentViewZoneIdsMod . clear ( ) ;
351
+ } ) ;
352
+ } ) ) ;
353
+
343
354
let ignoreChange = false ;
344
355
this . _register ( this . _editors . original . onDidScrollChange ( e => {
345
356
if ( e . scrollLeftChanged && ! ignoreChange ) {
@@ -504,20 +515,52 @@ function computeRangeAlignment(
504
515
const c = m . lineRangeMapping ;
505
516
handleAlignmentsOutsideOfDiffs ( c . originalRange . startLineNumber , c . modifiedRange . startLineNumber ) ;
506
517
507
- const originalAdditionalHeight = originalLineHeightOverrides
508
- . takeWhile ( v => v . lineNumber < c . originalRange . endLineNumberExclusive )
509
- ?. reduce ( ( p , c ) => p + c . heightInPx , 0 ) ?? 0 ;
510
- const modifiedAdditionalHeight = modifiedLineHeightOverrides
511
- . takeWhile ( v => v . lineNumber < c . modifiedRange . endLineNumberExclusive )
512
- ?. reduce ( ( p , c ) => p + c . heightInPx , 0 ) ?? 0 ;
513
-
514
- result . push ( {
515
- originalRange : c . originalRange ,
516
- modifiedRange : c . modifiedRange ,
517
- originalHeightInPx : c . originalRange . length * origLineHeight + originalAdditionalHeight ,
518
- modifiedHeightInPx : c . modifiedRange . length * modLineHeight + modifiedAdditionalHeight ,
519
- diff : m . lineRangeMapping ,
520
- } ) ;
518
+ let first = true ;
519
+ let lastModLineNumber = c . modifiedRange . startLineNumber ;
520
+ let lastOrigLineNumber = c . originalRange . startLineNumber ;
521
+
522
+ function emitAlignment ( origLineNumberExclusive : number , modLineNumberExclusive : number ) {
523
+ if ( origLineNumberExclusive < lastOrigLineNumber || modLineNumberExclusive < lastModLineNumber ) {
524
+ return ;
525
+ }
526
+ if ( first ) {
527
+ first = false ;
528
+ } else if ( origLineNumberExclusive === lastOrigLineNumber || modLineNumberExclusive === lastModLineNumber ) {
529
+ return ;
530
+ }
531
+ const originalRange = new LineRange ( lastOrigLineNumber , origLineNumberExclusive ) ;
532
+ const modifiedRange = new LineRange ( lastModLineNumber , modLineNumberExclusive ) ;
533
+ if ( originalRange . isEmpty && modifiedRange . isEmpty ) {
534
+ return ;
535
+ }
536
+
537
+ const originalAdditionalHeight = originalLineHeightOverrides
538
+ . takeWhile ( v => v . lineNumber < origLineNumberExclusive )
539
+ ?. reduce ( ( p , c ) => p + c . heightInPx , 0 ) ?? 0 ;
540
+ const modifiedAdditionalHeight = modifiedLineHeightOverrides
541
+ . takeWhile ( v => v . lineNumber < modLineNumberExclusive )
542
+ ?. reduce ( ( p , c ) => p + c . heightInPx , 0 ) ?? 0 ;
543
+
544
+ result . push ( {
545
+ originalRange,
546
+ modifiedRange,
547
+ originalHeightInPx : originalRange . length * origLineHeight + originalAdditionalHeight ,
548
+ modifiedHeightInPx : modifiedRange . length * modLineHeight + modifiedAdditionalHeight ,
549
+ } ) ;
550
+
551
+ lastOrigLineNumber = origLineNumberExclusive ;
552
+ lastModLineNumber = modLineNumberExclusive ;
553
+ }
554
+
555
+ for ( const i of c . innerChanges || [ ] ) {
556
+ if ( i . originalRange . startColumn > 1 && i . modifiedRange . startColumn > 1 ) {
557
+ // There is some unmodified text on this line
558
+ emitAlignment ( i . originalRange . startLineNumber , i . modifiedRange . startLineNumber ) ;
559
+ }
560
+ emitAlignment ( i . originalRange . endLineNumber , i . modifiedRange . endLineNumber ) ;
561
+ }
562
+
563
+ emitAlignment ( c . originalRange . endLineNumberExclusive , c . modifiedRange . endLineNumberExclusive ) ;
521
564
522
565
lastOriginalLineNumber = c . originalRange . endLineNumberExclusive ;
523
566
lastModifiedLineNumber = c . modifiedRange . endLineNumberExclusive ;
0 commit comments