Small strict null checking pass on a few files (#4293)

* fix some null checking

* fix various null strict checks

* move location fo sql files in json

* fix compile and more unused properties

* formatting

* small formatting changes

* readd types

* add comments for angular components

* formatting

* remove any decl
This commit is contained in:
Anthony Dresser
2019-03-14 18:18:32 -07:00
committed by GitHub
parent 0bf0e795ca
commit 4014c1d0ab
29 changed files with 881 additions and 1171 deletions

View File

@@ -1,79 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { ITask, createCancelablePromise, CancelablePromise } from 'vs/base/common/async';
import { Promise, TPromise, ValueCallback } from 'vs/base/common/winjs.base';
/**
* Bases on vscode Delayer, however, it works by only running the task if it gets
* a specified number of requests in a specified time
*
* Ex. Useful encapsulation of handling double click from click listeners
*/
export class MultipleRequestDelayer<T> {
private timeout: NodeJS.Timer;
private completionPromise: CancelablePromise<any>;
private onSuccess: ValueCallback;
private requests: number = 0;
private task: ITask<T>;
constructor(public delay: number, private maxRequests: number = 2) {
this.timeout = null;
this.completionPromise = null;
this.onSuccess = null;
}
trigger(task: ITask<T>): TPromise<T> {
this.cancelTimeout();
this.task = task;
if (++this.requests > this.maxRequests - 1) {
this.requests = 0;
this.onSuccess(null);
return this.completionPromise;
}
if (!this.completionPromise) {
this.completionPromise = createCancelablePromise<T>(() => new Promise(resolve => this.onSuccess = resolve).then(() => {
this.completionPromise = null;
this.onSuccess = null;
const task = this.task;
this.task = null;
return task();
}));
}
this.timeout = setTimeout(() => {
this.timeout = null;
this.requests = 0;
}, this.delay);
return this.completionPromise;
}
isTriggered(): boolean {
return this.timeout !== null;
}
cancel(): void {
this.cancelTimeout();
if (this.completionPromise) {
this.completionPromise.cancel();
this.completionPromise = null;
}
}
private cancelTimeout(): void {
if (this.timeout !== null) {
clearTimeout(this.timeout);
this.timeout = null;
}
}
}

View File

@@ -9,12 +9,16 @@
* Alterable version of the vs memorize function; to unmemoize use unmemoize
*/
export function memoize(target: any, key: string, descriptor: any) {
let fnKey: string = null;
let fn: Function = null;
let fnKey: string | null = null;
let fn: Function | null = null;
if (typeof descriptor.value === 'function') {
fnKey = 'value';
fn = descriptor.value;
if (fn!.length !== 0) {
console.warn('Memoize should only be used in functions with zero parameters');
}
} else if (typeof descriptor.get === 'function') {
fnKey = 'get';
fn = descriptor.get;
@@ -26,13 +30,13 @@ export function memoize(target: any, key: string, descriptor: any) {
const memoizeKey = `$memoize$${key}`;
descriptor[fnKey] = function (...args: any[]) {
descriptor[fnKey!] = function (...args: any[]) {
if (!this.hasOwnProperty(memoizeKey)) {
Object.defineProperty(this, memoizeKey, {
configurable: true,
enumerable: false,
writable: false,
value: fn.apply(this, args)
value: fn!.apply(this, args)
});
}
@@ -45,4 +49,4 @@ export function unmemoize(target: Object, key: string) {
if (target.hasOwnProperty(memoizeKey)) {
delete target[memoizeKey];
}
}
}

View File

@@ -1,89 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { Emitter, Event } from 'vs/base/common/event';
import { IDisposable } from 'vs/base/common/lifecycle';
/**
* Implementation of vs/base/common/event/echo that is clearable
* Similar to `buffer` but it buffers indefinitely and repeats
* the buffered events to every new listener.
*/
export function echo<T>(event: Event<T>, nextTick = false, buffer: T[] = []): { clear: () => void; event: Event<T> } {
buffer = buffer.slice();
event(e => {
buffer.push(e);
emitter.fire(e);
});
const flush = (listener: (e: T) => any, thisArgs?: any) => buffer.forEach(e => listener.call(thisArgs, e));
const clear = () => buffer = [];
const emitter = new Emitter<T>({
onListenerDidAdd(emitter, listener: (e: T) => any, thisArgs?: any) {
if (nextTick) {
setTimeout(() => flush(listener, thisArgs));
} else {
flush(listener, thisArgs);
}
}
});
return {
event: emitter.event,
clear
};
}
/**
* Implementation of vs/base/common/event/debounceEvent that is clearable
*/
export function debounceEvent<T>(event: Event<T>, merger: (last: T, event: T) => T, delay?: number, leading?: boolean): { clear: () => void; event: Event<T> };
export function debounceEvent<I, O>(event: Event<I>, merger: (last: O, event: I) => O, delay?: number, leading?: boolean): { clear: () => void; event: Event<O> };
export function debounceEvent<I, O>(event: Event<I>, merger: (last: O, event: I) => O, delay: number = 100, leading = false): { clear: () => void; event: Event<O> } {
let subscription: IDisposable;
let output: O = undefined;
let handle: any = undefined;
let numDebouncedCalls = 0;
const clear = () => output = undefined;
const emitter = new Emitter<O>({
onFirstListenerAdd() {
subscription = event(cur => {
numDebouncedCalls++;
output = merger(output, cur);
if (leading && !handle) {
emitter.fire(output);
}
clearTimeout(handle);
handle = setTimeout(() => {
let _output = output;
output = undefined;
handle = undefined;
if (!leading || numDebouncedCalls > 1) {
emitter.fire(_output);
}
numDebouncedCalls = 0;
}, delay);
});
},
onLastListenerRemove() {
subscription.dispose();
}
});
return {
event: emitter.event,
clear
};
}

View File

@@ -12,7 +12,7 @@ export class EmitterEvent {
public readonly type: string;
public readonly data: any;
constructor(eventType: string = null, data: any = null) {
constructor(eventType: string, data: any) {
this.type = eventType;
this.data = data;
}
@@ -46,9 +46,9 @@ export class EventEmitter implements IEventEmitter {
protected _bulkListeners: ListenerCallback[];
private _collectedEvents: EmitterEvent[];
private _deferredCnt: number;
private _allowedEventTypes: { [eventType: string]: boolean; };
private _allowedEventTypes: { [eventType: string]: boolean; } | null;
constructor(allowedEventTypes: string[] = null) {
constructor(allowedEventTypes?: string[]) {
this._listeners = {};
this._bulkListeners = [];
this._collectedEvents = [];
@@ -86,7 +86,8 @@ export class EventEmitter implements IEventEmitter {
this._listeners[eventType] = [listener];
}
let bound = this;
let bound: this | null = this;
let _listener: ListenerCallback | null = listener;
return {
dispose: () => {
if (!bound) {
@@ -94,11 +95,11 @@ export class EventEmitter implements IEventEmitter {
return;
}
bound._removeListener(eventType, listener);
bound._removeListener(eventType, _listener!);
// Prevent leakers from holding on to the event emitter
bound = null;
listener = null;
_listener = null;
}
};
}
@@ -212,10 +213,10 @@ export class EventEmitter implements IEventEmitter {
}
}
public deferredEmit<T>(callback: () => T): T {
public deferredEmit<T>(callback: () => T): T | undefined {
this.beginDeferredEmit();
let result: T = safeInvokeNoArg<T>(callback);
let result: T | undefined = safeInvokeNoArg<T>(callback);
this.endDeferredEmit();
@@ -251,7 +252,7 @@ export class OrderGuaranteeEventEmitter extends EventEmitter {
private _emitQueue: EmitQueueElement[];
constructor() {
super(null);
super();
this._emitQueue = [];
}
@@ -276,12 +277,14 @@ export class OrderGuaranteeEventEmitter extends EventEmitter {
while (this._emitQueue.length > 0) {
let queueElement = this._emitQueue.shift();
safeInvoke1Arg(queueElement.target, queueElement.arg);
if (queueElement) {
safeInvoke1Arg(queueElement.target, queueElement.arg);
}
}
}
}
function safeInvokeNoArg<T>(func: Function): T {
function safeInvokeNoArg<T>(func: Function): T | undefined {
try {
return func();
} catch (e) {

View File

@@ -5,113 +5,6 @@
'use strict';
// --- trie'ish datastructure
class Node<E> {
element?: E;
readonly children = new Map<string, Node<E>>();
}
/**
* A trie map that allows for fast look up when keys are substrings
* to the actual search keys (dir/subdir-problem).
*/
export class TrieMap<E> {
static PathSplitter = (s: string) => s.split(/[\\/]/).filter(s => !!s);
private readonly _splitter: (s: string) => string[];
private _root = new Node<E>();
constructor(splitter: (s: string) => string[] = TrieMap.PathSplitter) {
this._splitter = s => splitter(s).filter(s => Boolean(s));
}
insert(path: string, element: E): void {
const parts = this._splitter(path);
let i = 0;
// find insertion node
let node = this._root;
for (; i < parts.length; i++) {
let child = node.children.get(parts[i]);
if (child) {
node = child;
continue;
}
break;
}
// create new nodes
let newNode: Node<E>;
for (; i < parts.length; i++) {
newNode = new Node<E>();
node.children.set(parts[i], newNode);
node = newNode;
}
node.element = element;
}
lookUp(path: string): E {
const parts = this._splitter(path);
let { children } = this._root;
let node: Node<E>;
for (const part of parts) {
node = children.get(part);
if (!node) {
return undefined;
}
children = node.children;
}
return node.element;
}
findSubstr(path: string): E {
const parts = this._splitter(path);
let lastNode: Node<E>;
let { children } = this._root;
for (const part of parts) {
const node = children.get(part);
if (!node) {
break;
}
if (node.element) {
lastNode = node;
}
children = node.children;
}
// return the last matching node
// that had an element
if (lastNode) {
return lastNode.element;
}
return undefined;
}
findSuperstr(path: string): TrieMap<E> {
const parts = this._splitter(path);
let { children } = this._root;
let node: Node<E>;
for (const part of parts) {
node = children.get(part);
if (!node) {
return undefined;
}
children = node.children;
}
const result = new TrieMap<E>(this._splitter);
result._root = node;
return result;
}
}
export function toObject<V>(map: Map<string, V>): { [key: string]: V } {
if (map) {
let rt: { [key: string]: V } = Object.create(null);