Skip to content

Commit 2197cd0

Browse files
committed
Add clear method on DisposableStore
`clear` disposes of all tracked disposables but does not mark the store itself as disposed. If you need a mutatable list of disposables, this allows you to always use `readonly`/`const` disposable stores that can be registered on the base class.
1 parent a55cfe1 commit 2197cd0

7 files changed

Lines changed: 35 additions & 26 deletions

File tree

src/vs/base/common/lifecycle.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,20 @@ export class DisposableStore implements IDisposable {
4646
private _toDispose: IDisposable[] = [];
4747
private _isDisposed = false;
4848

49+
/**
50+
* Dispose of all registered disposables and mark this object as disposed.
51+
*
52+
* Any future disposables added to this object will be disposed of on `push`.
53+
*/
4954
public dispose(): void {
5055
this._isDisposed = true;
56+
this.clear();
57+
}
58+
59+
/**
60+
* Dispose of all registered disposables but do not mark this object as disposed.
61+
*/
62+
public clear(): void {
5163
this._toDispose = dispose(this._toDispose);
5264
}
5365

src/vs/editor/contrib/hover/hover.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export class ModesHoverController implements IEditorContribution {
3434

3535
private static readonly ID = 'editor.contrib.hover';
3636

37-
private _toUnhook = new DisposableStore();
37+
private readonly _toUnhook = new DisposableStore();
3838
private readonly _didChangeConfigurationHandler: IDisposable;
3939

4040
private _contentWidget: ModesContentHoverWidget;
@@ -109,8 +109,7 @@ export class ModesHoverController implements IEditorContribution {
109109
}
110110

111111
private _unhookEvents(): void {
112-
this._toUnhook.dispose();
113-
this._toUnhook = new DisposableStore();
112+
this._toUnhook.clear();
114113
}
115114

116115
private _onModelDecorationsChanged(): void {
@@ -226,6 +225,7 @@ export class ModesHoverController implements IEditorContribution {
226225

227226
public dispose(): void {
228227
this._unhookEvents();
228+
this._toUnhook.dispose();
229229
this._didChangeConfigurationHandler.dispose();
230230

231231
if (this._glyphWidget) {

src/vs/workbench/contrib/comments/browser/commentFormActions.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
import * as DOM from 'vs/base/browser/dom';
77
import { Button } from 'vs/base/browser/ui/button/button';
88
import { IAction } from 'vs/base/common/actions';
9-
import { DisposableStore } from 'vs/base/common/lifecycle';
9+
import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
1010
import { IMenu } from 'vs/platform/actions/common/actions';
1111
import { attachButtonStyler } from 'vs/platform/theme/common/styler';
1212
import { IThemeService } from 'vs/platform/theme/common/themeService';
1313

14-
export class CommentFormActions {
14+
export class CommentFormActions implements IDisposable {
1515
private _buttonElements: HTMLElement[] = [];
16-
private _toDispose = new DisposableStore();
16+
private readonly _toDispose = new DisposableStore();
1717

1818
constructor(
1919
private container: HTMLElement,
@@ -22,8 +22,7 @@ export class CommentFormActions {
2222
) { }
2323

2424
setActions(menu: IMenu) {
25-
this._toDispose.dispose();
26-
this._toDispose = new DisposableStore();
25+
this._toDispose.clear();
2726

2827
this._buttonElements.forEach(b => DOM.removeNode(b));
2928

@@ -44,4 +43,8 @@ export class CommentFormActions {
4443
});
4544
}
4645
}
46+
47+
dispose() {
48+
this._toDispose.dispose();
49+
}
4750
}

src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -960,7 +960,7 @@ export class DirtyDiffModel extends Disposable {
960960
private diffDelayer: ThrottledDelayer<IChange[] | null> | null;
961961
private _originalURIPromise?: Promise<URI | null>;
962962
private repositoryDisposables = new Set<IDisposable>();
963-
private originalModelDisposables: IDisposable = Disposable.None;
963+
private readonly originalModelDisposables = this._register(new DisposableStore());
964964

965965
private _onDidChange = new Emitter<ISplice<IChange>[]>();
966966
readonly onDidChange: Event<ISplice<IChange>[]> = this._onDidChange.event;
@@ -1069,12 +1069,9 @@ export class DirtyDiffModel extends Disposable {
10691069

10701070
this._originalModel = ref.object.textEditorModel;
10711071

1072-
const originalModelDisposables = new DisposableStore();
1073-
originalModelDisposables.push(ref);
1074-
originalModelDisposables.push(ref.object.textEditorModel.onDidChangeContent(() => this.triggerDiff()));
1075-
1076-
this.originalModelDisposables.dispose();
1077-
this.originalModelDisposables = originalModelDisposables;
1072+
this.originalModelDisposables.clear();
1073+
this.originalModelDisposables.push(ref);
1074+
this.originalModelDisposables.push(ref.object.textEditorModel.onDidChangeContent(() => this.triggerDiff()));
10781075

10791076
return originalUri;
10801077
});
@@ -1131,7 +1128,6 @@ export class DirtyDiffModel extends Disposable {
11311128
}
11321129

11331130
dispose(): void {
1134-
this.originalModelDisposables = dispose(this.originalModelDisposables);
11351131
super.dispose();
11361132

11371133
this._editorModel = null;

src/vs/workbench/contrib/snippets/browser/snippetsService.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,10 @@ class SnippetsService implements ISnippetsService {
295295
}
296296

297297
private _initFolderSnippets(source: SnippetSource, folder: URI, bucket: IDisposable[]): Promise<any> {
298-
let disposables = new DisposableStore();
299-
let addFolderSnippets = (type?: FileChangeType) => {
300-
disposables.dispose();
301-
disposables = new DisposableStore();
298+
const disposables = new DisposableStore();
299+
const addFolderSnippets = (type?: FileChangeType) => {
300+
disposables.clear();
301+
302302
if (type === FileChangeType.DELETED) {
303303
return Promise.resolve();
304304
}

src/vs/workbench/contrib/webview/browser/webviewEditor.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export class WebviewEditor extends BaseEditor {
3333
private _content?: HTMLElement;
3434
private _webviewContent: HTMLElement | undefined;
3535

36-
private _webviewFocusTrackerDisposables = new DisposableStore();
36+
private readonly _webviewFocusTrackerDisposables = new DisposableStore();
3737
private _onFocusWindowHandler?: IDisposable;
3838

3939
private readonly _onDidFocusWebview = this._register(new Emitter<void>());
@@ -304,8 +304,7 @@ export class WebviewEditor extends BaseEditor {
304304
}
305305

306306
private trackFocus() {
307-
this._webviewFocusTrackerDisposables.dispose();
308-
this._webviewFocusTrackerDisposables = new DisposableStore();
307+
this._webviewFocusTrackerDisposables.clear();
309308

310309
// Track focus in webview content
311310
const webviewContentFocusTracker = DOM.trackFocus(this._webviewContent!);

src/vs/workbench/services/files/test/node/diskFileService.test.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ suite('Disk File Service', () => {
125125
let testProvider: TestDiskFileSystemProvider;
126126
let testDir: string;
127127

128-
let disposables = new DisposableStore();
128+
const disposables = new DisposableStore();
129129

130130
setup(async () => {
131131
const logService = new NullLogService();
@@ -149,8 +149,7 @@ suite('Disk File Service', () => {
149149
});
150150

151151
teardown(async () => {
152-
disposables.dispose();
153-
disposables = new DisposableStore();
152+
disposables.clear();
154153

155154
await rimraf(parentDir, RimRafMode.MOVE);
156155
});

0 commit comments

Comments
 (0)