From 6d680a040f220e5158bf1d3ac08bff4299c11867 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 3 Jan 2019 15:51:45 -0800 Subject: [PATCH] Strongly type `Listener` Don't use `Function` as it allows any sort of calling pattern --- src/vs/base/common/event.ts | 10 +++++----- .../workbench/browser/parts/quickinput/quickInput.ts | 10 ++++++++-- .../services/search/test/node/rawSearchService.test.ts | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index c38d38816ee..ae776ba3967 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -355,7 +355,7 @@ export namespace Event { } } -type Listener = [Function, any] | Function; +type Listener = [(e: T) => void, any] | ((e: T) => void); export interface EmitterOptions { onFirstListenerAdd?: Function; @@ -466,8 +466,8 @@ export class Emitter { private readonly _leakageMon: LeakageMonitor | undefined; private _disposed: boolean = false; private _event: Event | undefined; - private _deliveryQueue: [Listener, T][] | undefined; - protected _listeners: LinkedList | undefined; + private _deliveryQueue: [Listener, T][] | undefined; + protected _listeners: LinkedList> | undefined; constructor(options?: EmitterOptions) { this._options = options; @@ -541,7 +541,7 @@ export class Emitter { * To be kept private to fire an event to * subscribers */ - fire(event: T): any { + fire(event: T): void { if (this._listeners) { // put all [listener,event]-pairs into delivery queue // then emit all event. an inner/nested event might be @@ -590,7 +590,7 @@ export interface IWaitUntil { export class AsyncEmitter extends Emitter { - private _asyncDeliveryQueue: [Listener, T, Promise[]][]; + private _asyncDeliveryQueue: [Listener, T, Promise[]][]; async fireAsync(eventFn: (thenables: Promise[], listener: Function) => T): Promise { if (!this._listeners) { diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index 675ea229fb8..3b33f1b9256 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -252,14 +252,20 @@ class QuickInput implements IQuickInput { this.ui.leftActionBar.clear(); const leftButtons = this.buttons.filter(button => button === backButton); this.ui.leftActionBar.push(leftButtons.map((button, index) => { - const action = new Action(`id-${index}`, '', button.iconClass || getIconClass(button.iconPath), true, () => this.onDidTriggerButtonEmitter.fire(button)); + const action = new Action(`id-${index}`, '', button.iconClass || getIconClass(button.iconPath), true, () => { + this.onDidTriggerButtonEmitter.fire(button); + return Promise.resolve(null); + }); action.tooltip = button.tooltip; return action; }), { icon: true, label: false }); this.ui.rightActionBar.clear(); const rightButtons = this.buttons.filter(button => button !== backButton); this.ui.rightActionBar.push(rightButtons.map((button, index) => { - const action = new Action(`id-${index}`, '', button.iconClass || getIconClass(button.iconPath), true, () => this.onDidTriggerButtonEmitter.fire(button)); + const action = new Action(`id-${index}`, '', button.iconClass || getIconClass(button.iconPath), true, () => { + this.onDidTriggerButtonEmitter.fire(button); + return Promise.resolve(null); + }); action.tooltip = button.tooltip; return action; }), { icon: true, label: false }); diff --git a/src/vs/workbench/services/search/test/node/rawSearchService.test.ts b/src/vs/workbench/services/search/test/node/rawSearchService.test.ts index a8c6bca7fb8..f70c142c406 100644 --- a/src/vs/workbench/services/search/test/node/rawSearchService.test.ts +++ b/src/vs/workbench/services/search/test/node/rawSearchService.test.ts @@ -143,7 +143,7 @@ suite('RawSearchService', () => { const service = new RawSearchService(); function fileSearch(config: IFileQuery, batchSize: number): Event { - let promise: CancelablePromise; + let promise: CancelablePromise; const emitter = new Emitter({ onFirstListenerAdd: () => { -- GitLab