Skip to content

Commit 3b2671f

Browse files
authored
Fixes bug when innerChanges is not defined. (microsoft#185340)
1 parent 72e2af6 commit 3b2671f

File tree

1 file changed

+22
-10
lines changed

1 file changed

+22
-10
lines changed

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

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,11 @@ export class DiffModel extends Disposable implements IDiffEditorViewModel {
5555
if (!diff) {
5656
return;
5757
}
58-
if (!this._showMoves.get()) {
59-
const textEdits = TextEditInfo.fromModelContentChanges(e.changes);
60-
this._lastDiff = applyModifiedEdits(this._lastDiff!, textEdits, model.original, model.modified);
58+
59+
const textEdits = TextEditInfo.fromModelContentChanges(e.changes);
60+
const result = applyModifiedEdits(this._lastDiff!, textEdits, model.original, model.modified);
61+
if (result) {
62+
this._lastDiff = result;
6163
this._diff.set(DiffState.fromDiffResult(this._lastDiff), undefined);
6264
const currentSyncedMovedText = this.syncedMovedTexts.get();
6365
this.syncedMovedTexts.set(currentSyncedMovedText ? this._lastDiff.moves.find(m => m.lineRangeMapping.modifiedRange.intersect(currentSyncedMovedText.lineRangeMapping.modifiedRange)) : undefined, undefined);
@@ -70,13 +72,16 @@ export class DiffModel extends Disposable implements IDiffEditorViewModel {
7072
if (!diff) {
7173
return;
7274
}
73-
if (!this._showMoves.get()) {
74-
const textEdits = TextEditInfo.fromModelContentChanges(e.changes);
75-
this._lastDiff = applyOriginalEdits(this._lastDiff!, textEdits, model.original, model.modified);
75+
76+
const textEdits = TextEditInfo.fromModelContentChanges(e.changes);
77+
const result = applyModifiedEdits(this._lastDiff!, textEdits, model.original, model.modified);
78+
if (result) {
79+
this._lastDiff = result;
7680
this._diff.set(DiffState.fromDiffResult(this._lastDiff), undefined);
7781
const currentSyncedMovedText = this.syncedMovedTexts.get();
7882
this.syncedMovedTexts.set(currentSyncedMovedText ? this._lastDiff.moves.find(m => m.lineRangeMapping.modifiedRange.intersect(currentSyncedMovedText.lineRangeMapping.modifiedRange)) : undefined, undefined);
7983
}
84+
8085
debouncer.schedule();
8186
}));
8287

@@ -107,8 +112,8 @@ export class DiffModel extends Disposable implements IDiffEditorViewModel {
107112
computeMoves: this._showMoves.read(reader),
108113
});
109114

110-
result = applyOriginalEdits(result, originalTextEditInfos, model.original, model.modified);
111-
result = applyModifiedEdits(result, modifiedTextEditInfos, model.original, model.modified);
115+
result = applyOriginalEdits(result, originalTextEditInfos, model.original, model.modified) ?? result;
116+
result = applyModifiedEdits(result, modifiedTextEditInfos, model.original, model.modified) ?? result;
112117

113118
const newUnchangedRegions = UnchangedRegion.fromDiffs(result.changes, model.original.getLineCount(), model.modified.getLineCount());
114119

@@ -327,13 +332,16 @@ export class UnchangedRegion {
327332
}
328333
}
329334

330-
function applyOriginalEdits(diff: IDocumentDiff, textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): IDocumentDiff {
335+
function applyOriginalEdits(diff: IDocumentDiff, textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): IDocumentDiff | undefined {
331336
if (textEdits.length === 0) {
332337
return diff;
333338
}
334339

335340
const diff2 = flip(diff);
336341
const diff3 = applyModifiedEdits(diff2, textEdits, modifiedTextModel, originalTextModel);
342+
if (!diff3) {
343+
return undefined;
344+
}
337345
return flip(diff3);
338346
}
339347

@@ -346,10 +354,14 @@ function flip(diff: IDocumentDiff): IDocumentDiff {
346354
};
347355
}
348356

349-
function applyModifiedEdits(diff: IDocumentDiff, textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): IDocumentDiff {
357+
function applyModifiedEdits(diff: IDocumentDiff, textEdits: TextEditInfo[], originalTextModel: ITextModel, modifiedTextModel: ITextModel): IDocumentDiff | undefined {
350358
if (textEdits.length === 0) {
351359
return diff;
352360
}
361+
if (diff.changes.some(c => !c.innerChanges) || diff.moves.length > 0) {
362+
// TODO support these cases
363+
return undefined;
364+
}
353365

354366
const changes = applyModifiedEditsToLineRangeMappings(diff.changes, textEdits, originalTextModel, modifiedTextModel);
355367

0 commit comments

Comments
 (0)