Skip to content

Commit 1428d44

Browse files
committed
Diff editors comparing files do not restore after reload (fix #99659)
1 parent a888b93 commit 1428d44

File tree

2 files changed

+40
-91
lines changed

2 files changed

+40
-91
lines changed

src/vs/workbench/browser/parts/editor/editor.contribution.ts

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/
4848
import { toLocalResource } from 'vs/base/common/resources';
4949
import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions';
5050
import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle';
51-
import { withNullAsUndefined } from 'vs/base/common/types';
5251
import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService';
5352
import { EditorAutoSave } from 'vs/workbench/browser/parts/editor/editorAutoSave';
5453
import { ThemeIcon } from 'vs/platform/theme/common/themeService';
@@ -169,9 +168,10 @@ class UntitledTextEditorInputFactory implements IEditorInputFactory {
169168

170169
Registry.as<IEditorInputFactoryRegistry>(EditorInputExtensions.EditorInputFactories).registerEditorInputFactory(UntitledTextEditorInput.ID, UntitledTextEditorInputFactory);
171170

171+
// Register SideBySide/DiffEditor Input Factory
172172
interface ISerializedSideBySideEditorInput {
173173
name: string;
174-
description: string;
174+
description: string | undefined;
175175

176176
detailsSerialized: string;
177177
masterSerialized: string;
@@ -180,16 +180,19 @@ interface ISerializedSideBySideEditorInput {
180180
masterTypeId: string;
181181
}
182182

183-
// Register Side by Side Editor Input Factory
184-
class SideBySideEditorInputFactory implements IEditorInputFactory {
183+
export abstract class AbstractSideBySideEditorInputFactory implements IEditorInputFactory {
184+
185+
private getInputFactories(detailsId: string, masterId: string): [IEditorInputFactory | undefined, IEditorInputFactory | undefined] {
186+
const registry = Registry.as<IEditorInputFactoryRegistry>(EditorInputExtensions.EditorInputFactories);
187+
188+
return [registry.getEditorInputFactory(detailsId), registry.getEditorInputFactory(masterId)];
189+
}
185190

186191
canSerialize(editorInput: EditorInput): boolean {
187-
const input = <SideBySideEditorInput>editorInput;
192+
const input = editorInput as SideBySideEditorInput | DiffEditorInput;
188193

189194
if (input.details && input.master) {
190-
const registry = Registry.as<IEditorInputFactoryRegistry>(EditorInputExtensions.EditorInputFactories);
191-
const detailsInputFactory = registry.getEditorInputFactory(input.details.getTypeId());
192-
const masterInputFactory = registry.getEditorInputFactory(input.master.getTypeId());
195+
const [detailsInputFactory, masterInputFactory] = this.getInputFactories(input.details.getTypeId(), input.master.getTypeId());
193196

194197
return !!(detailsInputFactory?.canSerialize(input.details) && masterInputFactory?.canSerialize(input.master));
195198
}
@@ -198,26 +201,25 @@ class SideBySideEditorInputFactory implements IEditorInputFactory {
198201
}
199202

200203
serialize(editorInput: EditorInput): string | undefined {
201-
const input = <SideBySideEditorInput>editorInput;
204+
const input = editorInput as SideBySideEditorInput | DiffEditorInput;
202205

203206
if (input.details && input.master) {
204-
const registry = Registry.as<IEditorInputFactoryRegistry>(EditorInputExtensions.EditorInputFactories);
205-
const detailsInputFactory = registry.getEditorInputFactory(input.details.getTypeId());
206-
const masterInputFactory = registry.getEditorInputFactory(input.master.getTypeId());
207-
207+
const [detailsInputFactory, masterInputFactory] = this.getInputFactories(input.details.getTypeId(), input.master.getTypeId());
208208
if (detailsInputFactory && masterInputFactory) {
209209
const detailsSerialized = detailsInputFactory.serialize(input.details);
210210
const masterSerialized = masterInputFactory.serialize(input.master);
211211

212212
if (detailsSerialized && masterSerialized) {
213-
return JSON.stringify(<ISerializedSideBySideEditorInput>{
213+
const serializedEditorInput: ISerializedSideBySideEditorInput = {
214214
name: input.getName(),
215215
description: input.getDescription(),
216216
detailsSerialized,
217217
masterSerialized,
218218
detailsTypeId: input.details.getTypeId(),
219219
masterTypeId: input.master.getTypeId()
220-
});
220+
};
221+
222+
return JSON.stringify(serializedEditorInput);
221223
}
222224
}
223225
}
@@ -228,24 +230,38 @@ class SideBySideEditorInputFactory implements IEditorInputFactory {
228230
deserialize(instantiationService: IInstantiationService, serializedEditorInput: string): EditorInput | undefined {
229231
const deserialized: ISerializedSideBySideEditorInput = JSON.parse(serializedEditorInput);
230232

231-
const registry = Registry.as<IEditorInputFactoryRegistry>(EditorInputExtensions.EditorInputFactories);
232-
const detailsInputFactory = registry.getEditorInputFactory(deserialized.detailsTypeId);
233-
const masterInputFactory = registry.getEditorInputFactory(deserialized.masterTypeId);
234-
233+
const [detailsInputFactory, masterInputFactory] = this.getInputFactories(deserialized.detailsTypeId, deserialized.masterTypeId);
235234
if (detailsInputFactory && masterInputFactory) {
236235
const detailsInput = detailsInputFactory.deserialize(instantiationService, deserialized.detailsSerialized);
237236
const masterInput = masterInputFactory.deserialize(instantiationService, deserialized.masterSerialized);
238237

239238
if (detailsInput && masterInput) {
240-
return new SideBySideEditorInput(deserialized.name, withNullAsUndefined(deserialized.description), detailsInput, masterInput);
239+
return this.createEditorInput(deserialized.name, deserialized.description, detailsInput, masterInput);
241240
}
242241
}
243242

244243
return undefined;
245244
}
245+
246+
protected abstract createEditorInput(name: string, description: string | undefined, detailsInput: EditorInput, masterInput: EditorInput): EditorInput;
247+
}
248+
249+
class SideBySideEditorInputFactory extends AbstractSideBySideEditorInputFactory {
250+
251+
protected createEditorInput(name: string, description: string | undefined, detailsInput: EditorInput, masterInput: EditorInput): EditorInput {
252+
return new SideBySideEditorInput(name, description, detailsInput, masterInput);
253+
}
254+
}
255+
256+
class DiffEditorInputFactory extends AbstractSideBySideEditorInputFactory {
257+
258+
protected createEditorInput(name: string, description: string | undefined, detailsInput: EditorInput, masterInput: EditorInput): EditorInput {
259+
return new DiffEditorInput(name, description, detailsInput, masterInput);
260+
}
246261
}
247262

248263
Registry.as<IEditorInputFactoryRegistry>(EditorInputExtensions.EditorInputFactories).registerEditorInputFactory(SideBySideEditorInput.ID, SideBySideEditorInputFactory);
264+
Registry.as<IEditorInputFactoryRegistry>(EditorInputExtensions.EditorInputFactories).registerEditorInputFactory(DiffEditorInput.ID, DiffEditorInputFactory);
249265

250266
// Register Editor Contributions
251267
registerEditorContribution(OpenWorkspaceButtonContribution.ID, OpenWorkspaceButtonContribution);

src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts

Lines changed: 4 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/
3939
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
4040
import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences';
4141
import { DefaultPreferencesEditorInput, KeybindingsEditorInput, PreferencesEditorInput, SettingsEditor2Input } from 'vs/workbench/services/preferences/common/preferencesEditorInput';
42+
import { AbstractSideBySideEditorInputFactory } from 'vs/workbench/browser/parts/editor/editor.contribution';
4243

4344
const SETTINGS_EDITOR_COMMAND_SEARCH = 'settings.action.search';
4445

@@ -89,79 +90,11 @@ Registry.as<IEditorRegistry>(EditorExtensions.Editors).registerEditor(
8990
]
9091
);
9192

92-
interface ISerializedPreferencesEditorInput {
93-
name: string;
94-
description: string;
95-
96-
detailsSerialized: string;
97-
masterSerialized: string;
98-
99-
detailsTypeId: string;
100-
masterTypeId: string;
101-
}
102-
10393
// Register Preferences Editor Input Factory
104-
class PreferencesEditorInputFactory implements IEditorInputFactory {
105-
106-
canSerialize(editorInput: EditorInput): boolean {
107-
const input = <PreferencesEditorInput>editorInput;
108-
109-
if (input.details && input.master) {
110-
const registry = Registry.as<IEditorInputFactoryRegistry>(EditorInputExtensions.EditorInputFactories);
111-
const detailsInputFactory = registry.getEditorInputFactory(input.details.getTypeId());
112-
const masterInputFactory = registry.getEditorInputFactory(input.master.getTypeId());
113-
114-
return !!(detailsInputFactory?.canSerialize(input.details) && masterInputFactory?.canSerialize(input.master));
115-
}
116-
117-
return false;
118-
}
119-
120-
serialize(editorInput: EditorInput): string | undefined {
121-
const input = <PreferencesEditorInput>editorInput;
122-
123-
if (input.details && input.master) {
124-
const registry = Registry.as<IEditorInputFactoryRegistry>(EditorInputExtensions.EditorInputFactories);
125-
const detailsInputFactory = registry.getEditorInputFactory(input.details.getTypeId());
126-
const masterInputFactory = registry.getEditorInputFactory(input.master.getTypeId());
127-
128-
if (detailsInputFactory && masterInputFactory) {
129-
const detailsSerialized = detailsInputFactory.serialize(input.details);
130-
const masterSerialized = masterInputFactory.serialize(input.master);
131-
132-
if (detailsSerialized && masterSerialized) {
133-
return JSON.stringify(<ISerializedPreferencesEditorInput>{
134-
name: input.getName(),
135-
description: input.getDescription(),
136-
detailsSerialized,
137-
masterSerialized,
138-
detailsTypeId: input.details.getTypeId(),
139-
masterTypeId: input.master.getTypeId()
140-
});
141-
}
142-
}
143-
}
144-
145-
return undefined;
146-
}
147-
148-
deserialize(instantiationService: IInstantiationService, serializedEditorInput: string): EditorInput | undefined {
149-
const deserialized: ISerializedPreferencesEditorInput = JSON.parse(serializedEditorInput);
150-
151-
const registry = Registry.as<IEditorInputFactoryRegistry>(EditorInputExtensions.EditorInputFactories);
152-
const detailsInputFactory = registry.getEditorInputFactory(deserialized.detailsTypeId);
153-
const masterInputFactory = registry.getEditorInputFactory(deserialized.masterTypeId);
154-
155-
if (detailsInputFactory && masterInputFactory) {
156-
const detailsInput = detailsInputFactory.deserialize(instantiationService, deserialized.detailsSerialized);
157-
const masterInput = masterInputFactory.deserialize(instantiationService, deserialized.masterSerialized);
158-
159-
if (detailsInput && masterInput) {
160-
return new PreferencesEditorInput(deserialized.name, deserialized.description, detailsInput, masterInput);
161-
}
162-
}
94+
class PreferencesEditorInputFactory extends AbstractSideBySideEditorInputFactory {
16395

164-
return undefined;
96+
protected createEditorInput(name: string, description: string | undefined, detailsInput: EditorInput, masterInput: EditorInput): EditorInput {
97+
return new PreferencesEditorInput(name, description, detailsInput, masterInput);
16598
}
16699
}
167100

0 commit comments

Comments
 (0)