Skip to content

Commit ea0a067

Browse files
committed
Strict null check for event.ts (#60565)
1 parent 3f7f72d commit ea0a067

File tree

2 files changed

+37
-25
lines changed

2 files changed

+37
-25
lines changed

Diff for: src/tsconfig.strictNullChecks.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"./vs/base/common/diff/diff.ts",
2222
"./vs/base/common/diff/diffChange.ts",
2323
"./vs/base/common/errors.ts",
24-
// "./vs/base/common/event.ts",
24+
"./vs/base/common/event.ts",
2525
"./vs/base/common/functional.ts",
2626
"./vs/base/common/idGenerator.ts",
2727
"./vs/base/common/iterator.ts",

Diff for: src/vs/base/common/event.ts

+36-24
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,16 @@ export class Emitter<T> {
5656

5757
private static readonly _noop = function () { };
5858

59-
private _event: Event<T>;
59+
private _event: Event<T> | null;
6060
private _disposed: boolean;
61-
private _deliveryQueue: [Listener, T][];
62-
protected _listeners: LinkedList<Listener>;
63-
64-
constructor(private _options?: EmitterOptions) {
65-
61+
private _deliveryQueue: [Listener, (T | undefined)][] | null;
62+
protected _listeners: LinkedList<Listener> | null;
63+
64+
constructor(private _options: EmitterOptions | null = null) {
65+
this._event = null;
66+
this._disposed = false;
67+
this._deliveryQueue = null;
68+
this._listeners = null;
6669
}
6770

6871
/**
@@ -98,8 +101,11 @@ export class Emitter<T> {
98101
result.dispose = Emitter._noop;
99102
if (!this._disposed) {
100103
remove();
101-
if (this._options && this._options.onLastListenerRemove && this._listeners.isEmpty()) {
102-
this._options.onLastListenerRemove(this);
104+
if (this._options && this._options.onLastListenerRemove) {
105+
const hasListeners = (this._listeners && !this._listeners.isEmpty());
106+
if (!hasListeners) {
107+
this._options.onLastListenerRemove(this);
108+
}
103109
}
104110
}
105111
}
@@ -133,7 +139,7 @@ export class Emitter<T> {
133139
}
134140

135141
while (this._deliveryQueue.length > 0) {
136-
const [listener, event] = this._deliveryQueue.shift();
142+
const [listener, event] = this._deliveryQueue.shift()!;
137143
try {
138144
if (typeof listener === 'function') {
139145
listener.call(undefined, event);
@@ -149,7 +155,7 @@ export class Emitter<T> {
149155

150156
dispose() {
151157
if (this._listeners) {
152-
this._listeners = undefined;
158+
this._listeners = null;
153159
}
154160
if (this._deliveryQueue) {
155161
this._deliveryQueue.length = 0;
@@ -184,7 +190,7 @@ export class AsyncEmitter<T extends IWaitUntil> extends Emitter<T> {
184190
}
185191

186192
while (this._asyncDeliveryQueue.length > 0) {
187-
const [listener, event, thenables] = this._asyncDeliveryQueue.shift();
193+
const [listener, event, thenables] = this._asyncDeliveryQueue.shift()!;
188194
try {
189195
if (typeof listener === 'function') {
190196
listener.call(undefined, event);
@@ -208,7 +214,7 @@ export class EventMultiplexer<T> implements IDisposable {
208214

209215
private readonly emitter: Emitter<T>;
210216
private hasListeners = false;
211-
private events: { event: Event<T>; listener: IDisposable; }[] = [];
217+
private events: { event: Event<T>; listener: IDisposable | null; }[] = [];
212218

213219
constructor() {
214220
this.emitter = new Emitter<T>({
@@ -251,12 +257,14 @@ export class EventMultiplexer<T> implements IDisposable {
251257
this.events.forEach(e => this.unhook(e));
252258
}
253259

254-
private hook(e: { event: Event<T>; listener: IDisposable; }): void {
260+
private hook(e: { event: Event<T>; listener: IDisposable | null; }): void {
255261
e.listener = e.event(r => this.emitter.fire(r));
256262
}
257263

258-
private unhook(e: { event: Event<T>; listener: IDisposable; }): void {
259-
e.listener.dispose();
264+
private unhook(e: { event: Event<T>; listener: IDisposable | null; }): void {
265+
if (e.listener) {
266+
e.listener.dispose();
267+
}
260268
e.listener = null;
261269
}
262270

@@ -270,7 +278,7 @@ export function fromPromise<T =any>(promise: Thenable<T>): Event<T> {
270278
let shouldEmit = false;
271279

272280
promise
273-
.then(null, () => null)
281+
.then(undefined, () => null)
274282
.then(() => {
275283
if (!shouldEmit) {
276284
setTimeout(() => emitter.fire(), 0);
@@ -321,11 +329,11 @@ export function anyEvent<T>(...events: Event<T>[]): Event<T> {
321329
}
322330

323331
export function debounceEvent<T>(event: Event<T>, merger: (last: T, event: T) => T, delay?: number, leading?: boolean): Event<T>;
324-
export function debounceEvent<I, O>(event: Event<I>, merger: (last: O, event: I) => O, delay?: number, leading?: boolean): Event<O>;
325-
export function debounceEvent<I, O>(event: Event<I>, merger: (last: O, event: I) => O, delay: number = 100, leading = false): Event<O> {
332+
export function debounceEvent<I, O>(event: Event<I>, merger: (last: O | undefined, event: I) => O, delay?: number, leading?: boolean): Event<O>;
333+
export function debounceEvent<I, O>(event: Event<I>, merger: (last: O | undefined, event: I) => O, delay: number = 100, leading = false): Event<O> {
326334

327335
let subscription: IDisposable;
328-
let output: O = undefined;
336+
let output: O | undefined = undefined;
329337
let handle: any = undefined;
330338
let numDebouncedCalls = 0;
331339

@@ -497,10 +505,10 @@ export function stopwatch<T>(event: Event<T>): Event<number> {
497505
* // 4
498506
* ```
499507
*/
500-
export function buffer<T>(event: Event<T>, nextTick = false, buffer: T[] = []): Event<T> {
501-
buffer = buffer.slice();
508+
export function buffer<T>(event: Event<T>, nextTick = false, _buffer: T[] = []): Event<T> {
509+
let buffer: T[] | null = _buffer.slice();
502510

503-
let listener = event(e => {
511+
let listener: IDisposable | null = event(e => {
504512
if (buffer) {
505513
buffer.push(e);
506514
} else {
@@ -509,7 +517,9 @@ export function buffer<T>(event: Event<T>, nextTick = false, buffer: T[] = []):
509517
});
510518

511519
const flush = () => {
512-
buffer.forEach(e => emitter.fire(e));
520+
if (buffer) {
521+
buffer.forEach(e => emitter.fire(e));
522+
}
513523
buffer = null;
514524
};
515525

@@ -531,7 +541,9 @@ export function buffer<T>(event: Event<T>, nextTick = false, buffer: T[] = []):
531541
},
532542

533543
onLastListenerRemove() {
534-
listener.dispose();
544+
if (listener) {
545+
listener.dispose();
546+
}
535547
listener = null;
536548
}
537549
});

0 commit comments

Comments
 (0)