From c0f7eb2268ccf1d665b0d2e564f26327e17ec361 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 21 Feb 2024 12:38:12 +0100 Subject: [PATCH] editors - use `canSerialize` properly --- .../workbench/common/editor/editorGroupModel.ts | 2 +- .../contrib/chat/browser/chatEditorInput.ts | 10 +++------- .../browser/interactive.contribution.ts | 17 +++++++++++------ .../browser/multiDiffEditorInput.ts | 10 ++++++---- .../browser/searchEditor.contribution.ts | 4 ++++ .../browser/terminalEditorSerializer.ts | 9 ++++----- .../browser/webviewEditorInputSerializer.ts | 2 +- .../common/untitledTextEditorHandler.ts | 2 +- 8 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/vs/workbench/common/editor/editorGroupModel.ts b/src/vs/workbench/common/editor/editorGroupModel.ts index 497ef8daf46e9..8a0182342560f 100644 --- a/src/vs/workbench/common/editor/editorGroupModel.ts +++ b/src/vs/workbench/common/editor/editorGroupModel.ts @@ -1033,7 +1033,7 @@ export class EditorGroupModel extends Disposable implements IEditorGroupModel { const editorSerializer = registry.getEditorSerializer(editor); if (editorSerializer) { - const value = editorSerializer.serialize(editor); + const value = editorSerializer.canSerialize(editor) ? editorSerializer.serialize(editor) : undefined; // Editor can be serialized if (typeof value === 'string') { diff --git a/src/vs/workbench/contrib/chat/browser/chatEditorInput.ts b/src/vs/workbench/contrib/chat/browser/chatEditorInput.ts index f59f81e2ffb16..e6cc6c81ff000 100644 --- a/src/vs/workbench/contrib/chat/browser/chatEditorInput.ts +++ b/src/vs/workbench/contrib/chat/browser/chatEditorInput.ts @@ -183,16 +183,12 @@ interface ISerializedChatEditorInput { } export class ChatEditorInputSerializer implements IEditorSerializer { - canSerialize(input: EditorInput): boolean { - return input instanceof ChatEditorInput; + canSerialize(input: EditorInput): input is ChatEditorInput & { readonly sessionId: string } { + return input instanceof ChatEditorInput && typeof input.sessionId === 'string'; } serialize(input: EditorInput): string | undefined { - if (!(input instanceof ChatEditorInput)) { - return undefined; - } - - if (typeof input.sessionId !== 'string') { + if (!this.canSerialize(input)) { return undefined; } diff --git a/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts b/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts index 3ba9491111ec4..05d7d253673f3 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts @@ -10,7 +10,6 @@ import { parse } from 'vs/base/common/marshalling'; import { Schemas } from 'vs/base/common/network'; import { extname, isEqual } from 'vs/base/common/resources'; import { isFalsyOrWhitespace } from 'vs/base/common/strings'; -import { assertType } from 'vs/base/common/types'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; @@ -263,13 +262,19 @@ type interactiveEditorInputData = { resource: URI; inputResource: URI; name: str export class InteractiveEditorSerializer implements IEditorSerializer { public static readonly ID = InteractiveEditorInput.ID; - canSerialize(editor: EditorInput): boolean { - const interactiveEditorInput = editor as InteractiveEditorInput; - return URI.isUri(interactiveEditorInput?.primary?.resource) && URI.isUri(interactiveEditorInput?.inputResource); + canSerialize(editor: EditorInput): editor is InteractiveEditorInput { + if (!(editor instanceof InteractiveEditorInput)) { + return false; + } + + return URI.isUri(editor.primary.resource) && URI.isUri(editor.inputResource); } - serialize(input: EditorInput): string { - assertType(input instanceof InteractiveEditorInput); + serialize(input: EditorInput): string | undefined { + if (!this.canSerialize(input)) { + return undefined; + } + return JSON.stringify({ resource: input.primary.resource, inputResource: input.inputResource, diff --git a/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput.ts b/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput.ts index 3841a5d56aa62..058373fd46540 100644 --- a/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput.ts +++ b/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput.ts @@ -364,14 +364,16 @@ interface ISerializedMultiDiffEditorInput { export class MultiDiffEditorSerializer implements IEditorSerializer { - // TODO@bpasero, @aiday-mar: following canSerialize should be removed (debt item) - canSerialize(editor: EditorInput): boolean { + canSerialize(editor: EditorInput): editor is MultiDiffEditorInput { return editor instanceof MultiDiffEditorInput && !editor.isTransient; } serialize(editor: MultiDiffEditorInput): string | undefined { - const shouldSerialize = editor instanceof MultiDiffEditorInput && !editor.isTransient; - return shouldSerialize ? JSON.stringify(editor.serialize()) : undefined; + if (!this.canSerialize(editor)) { + return undefined; + } + + return JSON.stringify(editor.serialize()); } deserialize(instantiationService: IInstantiationService, serializedEditor: string): EditorInput | undefined { diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts index 020ae109fd0e9..be7cad0444498 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts @@ -113,6 +113,10 @@ class SearchEditorInputSerializer implements IEditorSerializer { } serialize(input: SearchEditorInput) { + if (!this.canSerialize(input)) { + return undefined; + } + if (input.isDisposed()) { return JSON.stringify({ modelUri: undefined, dirty: false, config: input.tryReadConfigSync(), name: input.getName(), matchRanges: [], backingUri: input.backingUri?.toString() } as SerializedSearchEditor); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditorSerializer.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditorSerializer.ts index 5ad20c381c0f3..72200823f2ed3 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditorSerializer.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditorSerializer.ts @@ -14,16 +14,15 @@ export class TerminalInputSerializer implements IEditorSerializer { @ITerminalEditorService private readonly _terminalEditorService: ITerminalEditorService ) { } - public canSerialize(editorInput: TerminalEditorInput): boolean { - return !!editorInput.terminalInstance?.persistentProcessId; + public canSerialize(editorInput: TerminalEditorInput): editorInput is TerminalEditorInput & { readonly terminalInstance: ITerminalInstance } { + return typeof editorInput.terminalInstance?.persistentProcessId === 'number' && editorInput.terminalInstance.shouldPersist; } public serialize(editorInput: TerminalEditorInput): string | undefined { - if (!editorInput.terminalInstance?.persistentProcessId || !editorInput.terminalInstance.shouldPersist) { + if (!this.canSerialize(editorInput)) { return; } - const term = JSON.stringify(this._toJson(editorInput.terminalInstance)); - return term; + return JSON.stringify(this._toJson(editorInput.terminalInstance)); } public deserialize(instantiationService: IInstantiationService, serializedEditorInput: string): EditorInput | undefined { diff --git a/src/vs/workbench/contrib/webviewPanel/browser/webviewEditorInputSerializer.ts b/src/vs/workbench/contrib/webviewPanel/browser/webviewEditorInputSerializer.ts index ade4299afe4d0..8a590bff082fc 100644 --- a/src/vs/workbench/contrib/webviewPanel/browser/webviewEditorInputSerializer.ts +++ b/src/vs/workbench/contrib/webviewPanel/browser/webviewEditorInputSerializer.ts @@ -58,7 +58,7 @@ export class WebviewEditorInputSerializer implements IEditorSerializer { } public serialize(input: WebviewInput): string | undefined { - if (!this._webviewWorkbenchService.shouldPersist(input)) { + if (!this.canSerialize(input)) { return undefined; } diff --git a/src/vs/workbench/services/untitled/common/untitledTextEditorHandler.ts b/src/vs/workbench/services/untitled/common/untitledTextEditorHandler.ts index f786bd25f0424..b9357adb2c105 100644 --- a/src/vs/workbench/services/untitled/common/untitledTextEditorHandler.ts +++ b/src/vs/workbench/services/untitled/common/untitledTextEditorHandler.ts @@ -40,7 +40,7 @@ export class UntitledTextEditorInputSerializer implements IEditorSerializer { } serialize(editorInput: EditorInput): string | undefined { - if (!this.filesConfigurationService.isHotExitEnabled || editorInput.isDisposed()) { + if (!this.canSerialize(editorInput)) { return undefined; }