diff --git a/src/vs/base/common/lifecycle.ts b/src/vs/base/common/lifecycle.ts index 26291fdc7192a9ec2e168ca3b9140b4e80d41e78..90cc39b630b286a83d3f49a27af32352b95c1819 100644 --- a/src/vs/base/common/lifecycle.ts +++ b/src/vs/base/common/lifecycle.ts @@ -15,22 +15,17 @@ export function isDisposable(thing: E): thing is E & IDisposab } export function dispose(disposable: T): T; -export function dispose(...disposables: Array): T[]; +export function dispose(disposable: T | undefined): T | undefined; export function dispose(disposables: T[]): T[]; -export function dispose(first: T | T[], ...rest: T[]): T | T[] | undefined { - if (Array.isArray(first)) { - first.forEach(d => d && d.dispose()); +export function dispose(disposables: T | T[] | undefined): T | T[] | undefined { + if (Array.isArray(disposables)) { + disposables.forEach(d => d && d.dispose()); return []; - } else if (rest.length === 0) { - if (first) { - first.dispose(); - return first; - } - return undefined; + } else if (disposables) { + disposables.dispose(); + return disposables; } else { - dispose(first); - dispose(rest); - return []; + return undefined; } } diff --git a/src/vs/base/test/common/lifecycle.test.ts b/src/vs/base/test/common/lifecycle.test.ts index 29e93e64a41b373e8133ae9e421b5eca5bb1a7f7..46d8a254b5b54a1c40a96109807664613ffa6bd4 100644 --- a/src/vs/base/test/common/lifecycle.test.ts +++ b/src/vs/base/test/common/lifecycle.test.ts @@ -42,7 +42,8 @@ suite('Lifecycle', () => { assert(!disposable.isDisposed); assert(!disposable2.isDisposed); - dispose(disposable, disposable2); + dispose(disposable); + dispose(disposable2); assert(disposable.isDisposed); assert(disposable2.isDisposed); diff --git a/src/vs/editor/contrib/referenceSearch/referencesWidget.ts b/src/vs/editor/contrib/referenceSearch/referencesWidget.ts index 3c9e6e91b331cd7bf393f554158eb612ebd31a91..45aef6a5e5886da94a7fb063f5237966d9de38e8 100644 --- a/src/vs/editor/contrib/referenceSearch/referencesWidget.ts +++ b/src/vs/editor/contrib/referenceSearch/referencesWidget.ts @@ -230,7 +230,10 @@ export class ReferenceWidget extends PeekViewWidget { dispose(): void { this.setModel(undefined); this._callOnDispose = dispose(this._callOnDispose); - dispose(this._preview, this._previewNotAvailableMessage, this._tree, this._previewModelReference); + dispose(this._preview); + dispose(this._previewNotAvailableMessage); + dispose(this._tree); + dispose(this._previewModelReference); this._splitView.dispose(); super.dispose(); } diff --git a/src/vs/editor/contrib/suggest/wordContextKey.ts b/src/vs/editor/contrib/suggest/wordContextKey.ts index de2a026e5aafae85faccf63aac29874907db84a0..9461b86d339d1117c8abbcec99232054a011e3f8 100644 --- a/src/vs/editor/contrib/suggest/wordContextKey.ts +++ b/src/vs/editor/contrib/suggest/wordContextKey.ts @@ -4,15 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { RawContextKey, IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -export class WordContextKey { +export class WordContextKey extends Disposable { static readonly AtEnd = new RawContextKey('atEndOfWord', false); private readonly _ckAtEnd: IContextKey; - private readonly _confListener: IDisposable; private _enabled: boolean; private _selectionListener?: IDisposable; @@ -21,13 +20,15 @@ export class WordContextKey { private readonly _editor: ICodeEditor, @IContextKeyService contextKeyService: IContextKeyService, ) { + super(); this._ckAtEnd = WordContextKey.AtEnd.bindTo(contextKeyService); - this._confListener = this._editor.onDidChangeConfiguration(e => e.contribInfo && this._update()); + this._register(this._editor.onDidChangeConfiguration(e => e.contribInfo && this._update())); this._update(); } dispose(): void { - dispose(this._confListener, this._selectionListener); + super.dispose(); + dispose(this._selectionListener); this._ckAtEnd.reset(); } diff --git a/src/vs/workbench/api/browser/mainThreadMessageService.ts b/src/vs/workbench/api/browser/mainThreadMessageService.ts index 0343323cf05c098b0120d0628975db77027609f2..2c2507eca67b2a062e95d7b377aacaa13fc90d42 100644 --- a/src/vs/workbench/api/browser/mainThreadMessageService.ts +++ b/src/vs/workbench/api/browser/mainThreadMessageService.ts @@ -90,7 +90,8 @@ export class MainThreadMessageService implements MainThreadMessageServiceShape { // if promise has not been resolved yet, now is the time to ensure a return value // otherwise if already resolved it means the user clicked one of the buttons Event.once(messageHandle.onDidClose)(() => { - dispose(...primaryActions, ...secondaryActions); + dispose(primaryActions); + dispose(secondaryActions); resolve(undefined); }); }); diff --git a/src/vs/workbench/contrib/files/browser/saveErrorHandler.ts b/src/vs/workbench/contrib/files/browser/saveErrorHandler.ts index 996aa2f803100c31335220508c175c2f706ab8c6..3dac8f515d1af434a5f36e9ca34dfbb5f2f86100 100644 --- a/src/vs/workbench/contrib/files/browser/saveErrorHandler.ts +++ b/src/vs/workbench/contrib/files/browser/saveErrorHandler.ts @@ -175,7 +175,7 @@ export class SaveErrorHandler extends Disposable implements ISaveErrorHandler, I // Show message and keep function to hide in case the file gets saved/reverted const handle = this.notificationService.notify({ severity: Severity.Error, message, actions }); - Event.once(handle.onDidClose)(() => dispose(...actions.primary!, ...actions.secondary!)); + Event.once(handle.onDidClose)(() => { dispose(actions.primary!), dispose(actions.secondary!); }); this.messages.set(model.getResource(), handle); } @@ -258,7 +258,7 @@ class ResolveSaveConflictAction extends Action { actions.secondary!.push(this.instantiationService.createInstance(DoNotShowResolveConflictLearnMoreAction)); const handle = this.notificationService.notify({ severity: Severity.Info, message: conflictEditorHelp, actions }); - Event.once(handle.onDidClose)(() => dispose(...actions.primary!, ...actions.secondary!)); + Event.once(handle.onDidClose)(() => { dispose(actions.primary!); dispose(actions.secondary!); }); pendingResolveSaveConflictMessages.push(handle); }