Skip to content

Commit

Permalink
Strict null check for event.ts (#60565)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexdima committed Oct 11, 2018
1 parent 3f7f72d commit ea0a067
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 25 deletions.
2 changes: 1 addition & 1 deletion src/tsconfig.strictNullChecks.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"./vs/base/common/diff/diff.ts",
"./vs/base/common/diff/diffChange.ts",
"./vs/base/common/errors.ts",
// "./vs/base/common/event.ts",
"./vs/base/common/event.ts",
"./vs/base/common/functional.ts",
"./vs/base/common/idGenerator.ts",
"./vs/base/common/iterator.ts",
Expand Down
60 changes: 36 additions & 24 deletions src/vs/base/common/event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,16 @@ export class Emitter<T> {

private static readonly _noop = function () { };

private _event: Event<T>;
private _event: Event<T> | null;
private _disposed: boolean;
private _deliveryQueue: [Listener, T][];
protected _listeners: LinkedList<Listener>;

constructor(private _options?: EmitterOptions) {

private _deliveryQueue: [Listener, (T | undefined)][] | null;
protected _listeners: LinkedList<Listener> | null;

constructor(private _options: EmitterOptions | null = null) {
this._event = null;
this._disposed = false;
this._deliveryQueue = null;
this._listeners = null;
}

/**
Expand Down Expand Up @@ -98,8 +101,11 @@ export class Emitter<T> {
result.dispose = Emitter._noop;
if (!this._disposed) {
remove();
if (this._options && this._options.onLastListenerRemove && this._listeners.isEmpty()) {
this._options.onLastListenerRemove(this);
if (this._options && this._options.onLastListenerRemove) {
const hasListeners = (this._listeners && !this._listeners.isEmpty());
if (!hasListeners) {
this._options.onLastListenerRemove(this);
}
}
}
}
Expand Down Expand Up @@ -133,7 +139,7 @@ export class Emitter<T> {
}

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

dispose() {
if (this._listeners) {
this._listeners = undefined;
this._listeners = null;
}
if (this._deliveryQueue) {
this._deliveryQueue.length = 0;
Expand Down Expand Up @@ -184,7 +190,7 @@ export class AsyncEmitter<T extends IWaitUntil> extends Emitter<T> {
}

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

private readonly emitter: Emitter<T>;
private hasListeners = false;
private events: { event: Event<T>; listener: IDisposable; }[] = [];
private events: { event: Event<T>; listener: IDisposable | null; }[] = [];

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

private hook(e: { event: Event<T>; listener: IDisposable; }): void {
private hook(e: { event: Event<T>; listener: IDisposable | null; }): void {
e.listener = e.event(r => this.emitter.fire(r));
}

private unhook(e: { event: Event<T>; listener: IDisposable; }): void {
e.listener.dispose();
private unhook(e: { event: Event<T>; listener: IDisposable | null; }): void {
if (e.listener) {
e.listener.dispose();
}
e.listener = null;
}

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

promise
.then(null, () => null)
.then(undefined, () => null)
.then(() => {
if (!shouldEmit) {
setTimeout(() => emitter.fire(), 0);
Expand Down Expand Up @@ -321,11 +329,11 @@ export function anyEvent<T>(...events: Event<T>[]): Event<T> {
}

export function debounceEvent<T>(event: Event<T>, merger: (last: T, event: T) => T, delay?: number, leading?: boolean): Event<T>;
export function debounceEvent<I, O>(event: Event<I>, merger: (last: O, event: I) => O, delay?: number, leading?: boolean): Event<O>;
export function debounceEvent<I, O>(event: Event<I>, merger: (last: O, event: I) => O, delay: number = 100, leading = false): Event<O> {
export function debounceEvent<I, O>(event: Event<I>, merger: (last: O | undefined, event: I) => O, delay?: number, leading?: boolean): Event<O>;
export function debounceEvent<I, O>(event: Event<I>, merger: (last: O | undefined, event: I) => O, delay: number = 100, leading = false): Event<O> {

let subscription: IDisposable;
let output: O = undefined;
let output: O | undefined = undefined;
let handle: any = undefined;
let numDebouncedCalls = 0;

Expand Down Expand Up @@ -497,10 +505,10 @@ export function stopwatch<T>(event: Event<T>): Event<number> {
* // 4
* ```
*/
export function buffer<T>(event: Event<T>, nextTick = false, buffer: T[] = []): Event<T> {
buffer = buffer.slice();
export function buffer<T>(event: Event<T>, nextTick = false, _buffer: T[] = []): Event<T> {
let buffer: T[] | null = _buffer.slice();

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

const flush = () => {
buffer.forEach(e => emitter.fire(e));
if (buffer) {
buffer.forEach(e => emitter.fire(e));
}
buffer = null;
};

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

onLastListenerRemove() {
listener.dispose();
if (listener) {
listener.dispose();
}
listener = null;
}
});
Expand Down

0 comments on commit ea0a067

Please sign in to comment.