Skip to content

Commit 0f32f0e

Browse files
committed
Clean up some usages of IDisposable[]
Part of microsoft#74250 - Extend `Disposable` in classes where it makes sense - Use `DisposableStore` for lists of disposables - Make `combinedDisposable` take arguments instead of an array (so that you can't pass in an array and then modify the array after the fact)
1 parent 5e1f944 commit 0f32f0e

62 files changed

Lines changed: 398 additions & 470 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/vs/base/browser/htmlContentRenderer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { cloneAndChange } from 'vs/base/common/objects';
1717

1818
export interface IContentActionHandler {
1919
callback: (content: string, event?: IMouseEvent) => void;
20-
disposeables: IDisposable[];
20+
readonly disposeables: IDisposable[];
2121
}
2222

2323
export interface RenderOptions {

src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableEle
99
import { commonPrefixLength } from 'vs/base/common/arrays';
1010
import { Color } from 'vs/base/common/color';
1111
import { Emitter, Event } from 'vs/base/common/event';
12-
import { dispose, IDisposable, combinedDisposable } from 'vs/base/common/lifecycle';
12+
import { dispose, IDisposable, DisposableStore } from 'vs/base/common/lifecycle';
1313
import { ScrollbarVisibility } from 'vs/base/common/scrollable';
1414
import 'vs/css!./breadcrumbsWidget';
1515

@@ -134,14 +134,14 @@ export class BreadcrumbsWidget {
134134
}
135135

136136
private _updateDimensions(dim: dom.Dimension): IDisposable {
137-
let disposables: IDisposable[] = [];
137+
const disposables = new DisposableStore();
138138
disposables.push(dom.modify(() => {
139139
this._dimension = dim;
140140
this._domNode.style.width = `${dim.width}px`;
141141
this._domNode.style.height = `${dim.height}px`;
142142
disposables.push(this._updateScrollbar());
143143
}));
144-
return combinedDisposable(disposables);
144+
return disposables;
145145
}
146146

147147
private _updateScrollbar(): IDisposable {

src/vs/base/browser/ui/checkbox/checkbox.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { Emitter, Event } from 'vs/base/common/event';
1212
import { KeyCode } from 'vs/base/common/keyCodes';
1313
import * as objects from 'vs/base/common/objects';
1414
import { BaseActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar';
15-
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
15+
import { DisposableStore } from 'vs/base/common/lifecycle';
1616

1717
export interface ICheckboxOpts extends ICheckboxStyles {
1818
readonly actionClassName?: string;
@@ -31,19 +31,20 @@ const defaultOpts = {
3131
export class CheckboxActionViewItem extends BaseActionViewItem {
3232

3333
private checkbox: Checkbox;
34-
private disposables: IDisposable[] = [];
34+
private disposables = new DisposableStore();
3535

3636
render(container: HTMLElement): void {
3737
this.element = container;
3838

39-
this.disposables = dispose(this.disposables);
39+
this.disposables.dispose();
40+
this.disposables = new DisposableStore();
4041
this.checkbox = new Checkbox({
4142
actionClassName: this._action.class,
4243
isChecked: this._action.checked,
4344
title: this._action.label
4445
});
4546
this.disposables.push(this.checkbox);
46-
this.checkbox.onChange(() => this._action.checked = this.checkbox.checked, this, this.disposables);
47+
this.disposables.push(this.checkbox.onChange(() => this._action.checked = this.checkbox.checked, this));
4748
this.element.appendChild(this.checkbox.domNode);
4849
}
4950

@@ -64,10 +65,9 @@ export class CheckboxActionViewItem extends BaseActionViewItem {
6465
}
6566

6667
dipsose(): void {
67-
this.disposables = dispose(this.disposables);
68+
this.disposables.dispose();
6869
super.dispose();
6970
}
70-
7171
}
7272

7373
export class Checkbox extends Widget {

src/vs/base/browser/ui/contextview/contextview.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import 'vs/css!./contextview';
77
import * as DOM from 'vs/base/browser/dom';
8-
import { IDisposable, dispose, toDisposable, combinedDisposable, Disposable } from 'vs/base/common/lifecycle';
8+
import { IDisposable, dispose, toDisposable, Disposable, DisposableStore } from 'vs/base/common/lifecycle';
99
import { Range } from 'vs/base/common/range';
1010

1111
export interface IAnchor {
@@ -128,7 +128,7 @@ export class ContextView extends Disposable {
128128
this.container = container;
129129
this.container.appendChild(this.view);
130130

131-
const toDisposeOnSetContainer: IDisposable[] = [];
131+
const toDisposeOnSetContainer = new DisposableStore();
132132

133133
ContextView.BUBBLE_UP_EVENTS.forEach(event => {
134134
toDisposeOnSetContainer.push(DOM.addStandardDisposableListener(this.container!, event, (e: Event) => {
@@ -142,7 +142,7 @@ export class ContextView extends Disposable {
142142
}, true));
143143
});
144144

145-
this.toDisposeOnSetContainer = combinedDisposable(toDisposeOnSetContainer);
145+
this.toDisposeOnSetContainer = toDisposeOnSetContainer;
146146
}
147147
}
148148

src/vs/base/browser/ui/grid/grid.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import 'vs/css!./gridview';
77
import { Orientation } from 'vs/base/browser/ui/sash/sash';
8-
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
8+
import { Disposable } from 'vs/base/common/lifecycle';
99
import { tail2 as tail, equals } from 'vs/base/common/arrays';
1010
import { orthogonal, IView, GridView, Sizing as GridViewSizing, Box, IGridViewStyles } from './gridview';
1111
import { Event, Emitter } from 'vs/base/common/event';
@@ -191,12 +191,10 @@ export interface IGridOptions {
191191
proportionalLayout?: boolean;
192192
}
193193

194-
export class Grid<T extends IView> implements IDisposable {
194+
export class Grid<T extends IView> extends Disposable {
195195

196196
protected gridview: GridView;
197197
private views = new Map<T, HTMLElement>();
198-
private disposables: IDisposable[] = [];
199-
200198
get orientation(): Orientation { return this.gridview.orientation; }
201199
set orientation(orientation: Orientation) { this.gridview.orientation = orientation; }
202200

@@ -214,10 +212,11 @@ export class Grid<T extends IView> implements IDisposable {
214212
sashResetSizing: Sizing = Sizing.Distribute;
215213

216214
constructor(view: T, options: IGridOptions = {}) {
215+
super();
217216
this.gridview = new GridView(options);
218-
this.disposables.push(this.gridview);
217+
this._register(this.gridview);
219218

220-
this.gridview.onDidSashReset(this.doResetViewSize, this, this.disposables);
219+
this._register(this.gridview.onDidSashReset(this.doResetViewSize, this));
221220

222221
this._addView(view, 0, [0]);
223222
}
@@ -375,10 +374,6 @@ export class Grid<T extends IView> implements IDisposable {
375374
this.gridview.distributeViewSizes(parentLocation);
376375
}
377376
}
378-
379-
dispose(): void {
380-
this.disposables = dispose(this.disposables);
381-
}
382377
}
383378

384379
export interface ISerializableView extends IView {

src/vs/base/browser/ui/menu/menubar.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { ActionRunner, IAction, IActionRunner } from 'vs/base/common/actions';
1515
import { RunOnceScheduler } from 'vs/base/common/async';
1616
import { Event, Emitter } from 'vs/base/common/event';
1717
import { KeyCode, ResolvedKeybinding } from 'vs/base/common/keyCodes';
18-
import { Disposable, dispose, IDisposable } from 'vs/base/common/lifecycle';
18+
import { Disposable, dispose, IDisposable, DisposableStore } from 'vs/base/common/lifecycle';
1919
import { withNullAsUndefined } from 'vs/base/common/types';
2020
import { asArray } from 'vs/base/common/arrays';
2121

@@ -896,7 +896,7 @@ interface IModifierKeyStatus {
896896

897897
class ModifierKeyEmitter extends Emitter<IModifierKeyStatus> {
898898

899-
private _subscriptions: IDisposable[] = [];
899+
private readonly _subscriptions = new DisposableStore();
900900
private _keyStatus: IModifierKeyStatus;
901901
private static instance: ModifierKeyEmitter;
902902

@@ -992,6 +992,6 @@ class ModifierKeyEmitter extends Emitter<IModifierKeyStatus> {
992992

993993
dispose() {
994994
super.dispose();
995-
this._subscriptions = dispose(this._subscriptions);
995+
this._subscriptions.dispose();
996996
}
997997
}

src/vs/base/browser/ui/selectBox/selectBoxNative.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,25 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
6+
import { Disposable } from 'vs/base/common/lifecycle';
77
import { Event, Emitter } from 'vs/base/common/event';
88
import { KeyCode } from 'vs/base/common/keyCodes';
99
import * as dom from 'vs/base/browser/dom';
1010
import * as arrays from 'vs/base/common/arrays';
1111
import { ISelectBoxDelegate, ISelectOptionItem, ISelectBoxOptions, ISelectBoxStyles, ISelectData } from 'vs/base/browser/ui/selectBox/selectBox';
1212
import { isMacintosh } from 'vs/base/common/platform';
1313

14-
export class SelectBoxNative implements ISelectBoxDelegate {
14+
export class SelectBoxNative extends Disposable implements ISelectBoxDelegate {
1515

1616
private selectElement: HTMLSelectElement;
1717
private selectBoxOptions: ISelectBoxOptions;
1818
private options: ISelectOptionItem[];
1919
private selected: number;
2020
private readonly _onDidSelect: Emitter<ISelectData>;
21-
private toDispose: IDisposable[];
2221
private styles: ISelectBoxStyles;
2322

2423
constructor(options: ISelectOptionItem[], selected: number, styles: ISelectBoxStyles, selectBoxOptions?: ISelectBoxOptions) {
25-
this.toDispose = [];
24+
super();
2625
this.selectBoxOptions = selectBoxOptions || Object.create(null);
2726

2827
this.options = [];
@@ -36,7 +35,7 @@ export class SelectBoxNative implements ISelectBoxDelegate {
3635
}
3736

3837
this._onDidSelect = new Emitter<ISelectData>();
39-
this.toDispose.push(this._onDidSelect);
38+
this._register(this._onDidSelect);
4039

4140
this.styles = styles;
4241

@@ -46,15 +45,15 @@ export class SelectBoxNative implements ISelectBoxDelegate {
4645

4746
private registerListeners() {
4847

49-
this.toDispose.push(dom.addStandardDisposableListener(this.selectElement, 'change', (e) => {
48+
this._register(dom.addStandardDisposableListener(this.selectElement, 'change', (e) => {
5049
this.selectElement.title = e.target.value;
5150
this._onDidSelect.fire({
5251
index: e.target.selectedIndex,
5352
selected: e.target.value
5453
});
5554
}));
5655

57-
this.toDispose.push(dom.addStandardDisposableListener(this.selectElement, 'keydown', (e) => {
56+
this._register(dom.addStandardDisposableListener(this.selectElement, 'keydown', (e) => {
5857
let showSelect = false;
5958

6059
if (isMacintosh) {
@@ -168,8 +167,4 @@ export class SelectBoxNative implements ISelectBoxDelegate {
168167

169168
return option;
170169
}
171-
172-
public dispose(): void {
173-
this.toDispose = dispose(this.toDispose);
174-
}
175170
}

src/vs/base/browser/ui/splitview/panelview.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import 'vs/css!./panelview';
7-
import { IDisposable, dispose, combinedDisposable, Disposable } from 'vs/base/common/lifecycle';
7+
import { IDisposable, dispose, Disposable, DisposableStore } from 'vs/base/common/lifecycle';
88
import { Event, Emitter } from 'vs/base/common/event';
99
import { domEvent } from 'vs/base/browser/event';
1010
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
@@ -397,24 +397,24 @@ export class PanelView extends Disposable {
397397
}
398398

399399
addPanel(panel: Panel, size: number, index = this.splitview.length): void {
400-
const disposables: IDisposable[] = [];
400+
const disposables = new DisposableStore();
401401

402402
// https://github.com/Microsoft/vscode/issues/59950
403403
let shouldAnimate = false;
404404
disposables.push(scheduleAtNextAnimationFrame(() => shouldAnimate = true));
405405

406-
Event.filter(panel.onDidChange, () => shouldAnimate)
407-
(this.setupAnimation, this, disposables);
406+
disposables.push(Event.filter(panel.onDidChange, () => shouldAnimate)
407+
(this.setupAnimation, this));
408408

409-
const panelItem = { panel, disposable: combinedDisposable(disposables) };
409+
const panelItem = { panel, disposable: disposables };
410410
this.panelItems.splice(index, 0, panelItem);
411411
panel.width = this.width;
412412
this.splitview.addView(panel, size, index);
413413

414414
if (this.dnd) {
415415
const draggable = new PanelDraggable(panel, this.dnd, this.dndContext);
416416
disposables.push(draggable);
417-
draggable.onDidDrop(this._onDidDrop.fire, this._onDidDrop, disposables);
417+
disposables.push(draggable.onDidDrop(this._onDidDrop.fire, this._onDidDrop));
418418
}
419419
}
420420

src/vs/base/browser/ui/splitview/splitview.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import 'vs/css!./splitview';
7-
import { IDisposable, combinedDisposable, toDisposable, Disposable } from 'vs/base/common/lifecycle';
7+
import { IDisposable, toDisposable, Disposable, combinedDisposable } from 'vs/base/common/lifecycle';
88
import { Event, Emitter } from 'vs/base/common/event';
99
import * as types from 'vs/base/common/types';
1010
import * as dom from 'vs/base/browser/dom';
@@ -199,7 +199,7 @@ export class SplitView extends Disposable {
199199

200200
const onChangeDisposable = view.onDidChange(size => this.onViewChange(item, size));
201201
const containerDisposable = toDisposable(() => this.viewContainer.removeChild(container));
202-
const disposable = combinedDisposable([onChangeDisposable, containerDisposable]);
202+
const disposable = combinedDisposable(onChangeDisposable, containerDisposable);
203203

204204
const layoutContainer = this.orientation === Orientation.VERTICAL
205205
? () => item.container.style.height = `${item.size}px`
@@ -245,7 +245,7 @@ export class SplitView extends Disposable {
245245
const onEndDisposable = onEnd(this.onSashEnd, this);
246246
const onDidResetDisposable = sash.onDidReset(() => this._onDidSashReset.fire(firstIndex(this.sashItems, item => item.sash === sash)));
247247

248-
const disposable = combinedDisposable([onStartDisposable, onChangeDisposable, onEndDisposable, onDidResetDisposable, sash]);
248+
const disposable = combinedDisposable(onStartDisposable, onChangeDisposable, onEndDisposable, onDidResetDisposable, sash);
249249
const sashItem: ISashItem = { sash, disposable };
250250

251251
this.sashItems.splice(index - 1, 0, sashItem);
@@ -369,10 +369,10 @@ export class SplitView extends Disposable {
369369
const index = firstIndex(this.sashItems, item => item.sash === sash);
370370

371371
// This way, we can press Alt while we resize a sash, macOS style!
372-
const disposable = combinedDisposable([
372+
const disposable = combinedDisposable(
373373
domEvent(document.body, 'keydown')(e => resetSashDragState(this.sashDragState.current, e.altKey)),
374374
domEvent(document.body, 'keyup')(() => resetSashDragState(this.sashDragState.current, false))
375-
]);
375+
);
376376

377377
const resetSashDragState = (start: number, alt: boolean) => {
378378
const sizes = this.viewItems.map(i => i.size);

src/vs/base/common/actions.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { IDisposable, combinedDisposable, Disposable } from 'vs/base/common/lifecycle';
6+
import { IDisposable, Disposable } from 'vs/base/common/lifecycle';
77
import { Event, Emitter } from 'vs/base/common/event';
88

99
export interface ITelemetryData {
@@ -217,16 +217,16 @@ export class RadioGroup extends Disposable {
217217
constructor(readonly actions: Action[]) {
218218
super();
219219

220-
this._register(combinedDisposable(actions.map(action => {
221-
return action.onDidChange(e => {
220+
for (const action of actions) {
221+
this._register(action.onDidChange(e => {
222222
if (e.checked && action.checked) {
223223
for (const candidate of actions) {
224224
if (candidate !== action) {
225225
candidate.checked = false;
226226
}
227227
}
228228
}
229-
});
230-
})));
229+
}));
230+
}
231231
}
232232
}

0 commit comments

Comments
 (0)