@@ -7,7 +7,7 @@ import { $ } from 'vs/base/browser/dom';
77import { ArrayQueue } from 'vs/base/common/arrays' ;
88import { RunOnceScheduler } from 'vs/base/common/async' ;
99import { 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' ;
1111import { IObservable , derived , observableFromEvent , observableValue } from 'vs/base/common/observable' ;
1212import { autorun , autorunWithStore2 } from 'vs/base/common/observableImpl/autorun' ;
1313import { ThemeIcon } from 'vs/base/common/themables' ;
@@ -340,6 +340,17 @@ export class ViewZoneManager extends Disposable {
340340 scrollState . restore ( this . _editors . modified ) ;
341341 } ) ) ;
342342
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+
343354 let ignoreChange = false ;
344355 this . _register ( this . _editors . original . onDidScrollChange ( e => {
345356 if ( e . scrollLeftChanged && ! ignoreChange ) {
@@ -504,20 +515,52 @@ function computeRangeAlignment(
504515 const c = m . lineRangeMapping ;
505516 handleAlignmentsOutsideOfDiffs ( c . originalRange . startLineNumber , c . modifiedRange . startLineNumber ) ;
506517
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 ) ;
521564
522565 lastOriginalLineNumber = c . originalRange . endLineNumberExclusive ;
523566 lastModifiedLineNumber = c . modifiedRange . endLineNumberExclusive ;
0 commit comments