From 91c2b00bab28523980a942a8b3b82deedd98451d Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 13 Nov 2023 12:23:58 +0100 Subject: [PATCH] Caches view model on input. --- .../browser/multiDiffEditor.ts | 37 +++++-------------- .../browser/multiDiffEditorInput.ts | 35 +++++++++++++++++- 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditor.ts b/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditor.ts index 6ca92292e4c8c..c30446f92f0a9 100644 --- a/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditor.ts +++ b/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditor.ts @@ -4,20 +4,17 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from 'vs/base/browser/dom'; -import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; -import { IEditorOpenContext } from 'vs/workbench/common/editor'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { IStorageService } from 'vs/platform/storage/common/storage'; -import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { CancellationToken } from 'vs/base/common/cancellation'; +import { MultiDiffEditorWidget } from 'vs/editor/browser/widget/multiDiffEditorWidget/multiDiffEditorWidget'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; -import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; +import { IEditorOpenContext } from 'vs/workbench/common/editor'; import { MultiDiffEditorInput } from 'vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput'; -import { MultiDiffEditorWidget } from 'vs/editor/browser/widget/multiDiffEditorWidget/multiDiffEditorWidget'; -import { toDisposable } from 'vs/base/common/lifecycle'; -import { ConstLazyPromise, IDiffEntry } from 'vs/editor/browser/widget/multiDiffEditorWidget/model'; export class MultiDiffEditor extends EditorPane { static readonly ID = 'multiDiffEditor'; @@ -27,7 +24,6 @@ export class MultiDiffEditor extends EditorPane { constructor( @IInstantiationService private readonly instantiationService: InstantiationService, @ITelemetryService telemetryService: ITelemetryService, - @ITextModelService private readonly textModelService: ITextModelService, @IThemeService themeService: IThemeService, @IStorageService storageService: IStorageService ) { @@ -40,21 +36,8 @@ export class MultiDiffEditor extends EditorPane { override async setInput(input: MultiDiffEditorInput, options: IEditorOptions | undefined, context: IEditorOpenContext, token: CancellationToken): Promise { await super.setInput(input, options, context, token); - - const rs = await Promise.all(input.resources.map(async r => ({ - originalRef: await this.textModelService.createModelReference(r.original!), - modifiedRef: await this.textModelService.createModelReference(r.modified!), - title: r.resource.fsPath, - }))); - - this._multiDiffEditorWidget?.setModel({ - onDidChange: () => toDisposable(() => { }), - diffs: rs.map(r => new ConstLazyPromise({ - original: r.originalRef.object.textEditorModel, - modified: r.modifiedRef.object.textEditorModel, - title: r.title, - })), - }); + const vm = await input.getViewModel(); + this._multiDiffEditorWidget?.setModel(vm); } layout(dimension: DOM.Dimension): void { diff --git a/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput.ts b/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput.ts index 59b39f6e7143f..dd4365ba554c0 100644 --- a/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput.ts +++ b/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput.ts @@ -7,6 +7,9 @@ import { localize } from 'vs/nls'; import { URI } from 'vs/base/common/uri'; import { DEFAULT_EDITOR_ASSOCIATION, EditorInputCapabilities } from 'vs/workbench/common/editor'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; +import { ConstLazyPromise, IDiffEntry, IMultiDocumentDiffEditorModel } from 'vs/editor/browser/widget/multiDiffEditorWidget/model'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { toDisposable } from 'vs/base/common/lifecycle'; export class MultiDiffEditorInput extends EditorInput { static readonly ID: string = 'workbench.input.multiDiffEditor'; @@ -31,9 +34,39 @@ export class MultiDiffEditorInput extends EditorInput { return DEFAULT_EDITOR_ASSOCIATION.id; } - constructor(readonly label: string | undefined, readonly resources: readonly MultiDiffEditorInputData[]) { + private _viewModel: IMultiDocumentDiffEditorModel | undefined; + + constructor( + readonly label: string | undefined, + readonly resources: readonly MultiDiffEditorInputData[], + @ITextModelService private readonly _textModelService: ITextModelService, + ) { super(); } + + async getViewModel(): Promise { + if (!this._viewModel) { + this._viewModel = await this._createViewModel(); + } + return this._viewModel; + } + + private async _createViewModel(): Promise { + const rs = await Promise.all(this.resources.map(async r => ({ + originalRef: await this._textModelService.createModelReference(r.original!), + modifiedRef: await this._textModelService.createModelReference(r.modified!), + title: r.resource.fsPath, + }))); + + return { + onDidChange: () => toDisposable(() => { }), + diffs: rs.map(r => new ConstLazyPromise({ + original: r.originalRef.object.textEditorModel, + modified: r.modifiedRef.object.textEditorModel, + title: r.title, + })), + }; + } } export class MultiDiffEditorInputData {