Skip to content

Commit 8e7d6f8

Browse files
authored
Merge pull request microsoft#187810 from microsoft/hediet/b/unaware-leech
Fixes microsoft#162450 - Support Inner Diff Line Alignment
2 parents ca6ebd6 + c8fe3e5 commit 8e7d6f8

File tree

2 files changed

+68
-24
lines changed

2 files changed

+68
-24
lines changed

src/vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -136,15 +136,16 @@ export class DiffEditorWidget2 extends DelegatingEditor implements IDiffEditor {
136136
this._register(autorunWithStore2('DiffEditorDecorations', (reader, store) => {
137137
store.add(new (readHotReloadableExport(DiffEditorDecorations, reader))(this._editors, this._diffModel, this._options));
138138
}));
139-
140-
this._register(this._instantiationService.createInstance(
141-
ViewZoneManager,
142-
this._editors,
143-
this._diffModel,
144-
this._options,
145-
this,
146-
() => this.unchangedRangesFeature.isUpdatingViewZones,
147-
));
139+
this._register(autorunWithStore2('ViewZoneManager', (reader, store) => {
140+
store.add(this._instantiationService.createInstance(
141+
readHotReloadableExport(ViewZoneManager, reader),
142+
this._editors,
143+
this._diffModel,
144+
this._options,
145+
this,
146+
() => this.unchangedRangesFeature.isUpdatingViewZones,
147+
));
148+
}));
148149

149150
this._register(autorunWithStore2('OverviewRulerPart', (reader, store) => {
150151
store.add(this._instantiationService.createInstance(readHotReloadableExport(OverviewRulerPart, reader), this._editors,

src/vs/editor/browser/widget/diffEditorWidget2/lineAlignment.ts

Lines changed: 58 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { $ } from 'vs/base/browser/dom';
77
import { ArrayQueue } from 'vs/base/common/arrays';
88
import { RunOnceScheduler } from 'vs/base/common/async';
99
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';
1111
import { IObservable, derived, observableFromEvent, observableValue } from 'vs/base/common/observable';
1212
import { autorun, autorunWithStore2 } from 'vs/base/common/observableImpl/autorun';
1313
import { 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

Comments
 (0)