Skip to content

Commit 1642bab

Browse files
author
Benjamin Pasero
committed
editors - ensure to open editor when save fails and model is still dirty
1 parent 1f3efeb commit 1642bab

1 file changed

Lines changed: 13 additions & 22 deletions

File tree

src/vs/workbench/contrib/files/browser/editors/fileEditorTracker.ts

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,9 @@ export class FileEditorTracker extends Disposable implements IWorkbenchContribut
5959
// Update editors from disk changes
6060
this._register(this.fileService.onFileChanges(e => this.onFileChanges(e)));
6161

62-
// Open editors from dirty text file models
63-
this._register(this.textFileService.models.onModelsDirty(e => this.onTextFilesDirty(e)));
62+
// Ensure dirty text file models are always opened as editors
63+
this._register(this.textFileService.models.onModelsDirty(e => this.ensureDirtyTextFilesAreOpened(e)));
64+
this._register(this.textFileService.models.onModelsSaveError(e => this.ensureDirtyTextFilesAreOpened(e)));
6465

6566
// Out of workspace file watchers
6667
this._register(this.editorService.onDidVisibleEditorsChange(() => this.onDidVisibleEditorsChange()));
@@ -263,29 +264,19 @@ export class FileEditorTracker extends Disposable implements IWorkbenchContribut
263264

264265
//#endregion
265266

266-
//#region Text File Dirty: Ensure every dirty text file is opened in an editor
267+
//#region Text File: Ensure every dirty text file is opened in an editor
267268

268-
private onTextFilesDirty(events: ReadonlyArray<TextFileModelChangeEvent>): void {
269-
270-
// If files become dirty but are not opened, we open it in the background unless there are pending to be saved
271-
this.doOpenDirtyResourcesInBackground(distinct(events.filter(({ resource }) => {
272-
273-
// Only dirty models that are not PENDING_SAVE
269+
private ensureDirtyTextFilesAreOpened(events: ReadonlyArray<TextFileModelChangeEvent>): void {
270+
this.editorService.openEditors(distinct(events.filter(({ resource }) => {
274271
const model = this.textFileService.models.get(resource);
275-
const shouldOpen = model?.isDirty() && !model.hasState(ModelState.PENDING_SAVE);
276-
277-
// Only if not open already
278-
return shouldOpen && !this.editorService.isOpen({ resource });
279-
}).map(event => event.resource), resource => resource.toString()));
280-
}
281272

282-
private doOpenDirtyResourcesInBackground(resources: URI[]): void {
283-
this.editorService.openEditors(resources.map(resource => {
284-
return {
285-
resource,
286-
options: { inactive: true, pinned: true, preserveFocus: true }
287-
};
288-
}));
273+
return model?.hasState(ModelState.DIRTY) && // model must be dirty
274+
!model.hasState(ModelState.PENDING_SAVE) && // model should not be saving currently
275+
!this.editorService.isOpen({ resource }); // model is not currently opened as editor
276+
}).map(event => event.resource), resource => resource.toString()).map(resource => ({
277+
resource,
278+
options: { inactive: true, pinned: true, preserveFocus: true }
279+
})));
289280
}
290281

291282
//#endregion

0 commit comments

Comments
 (0)