From ff13b502778296c9124b2926a1b7a35ab9c3d3fe Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 17 Oct 2018 16:19:10 -0700 Subject: [PATCH] Strict null checking some more files in base/node #60565 --- src/tsconfig.strictNullChecks.json | 14 ++++++++++++++ src/vs/base/node/console.ts | 16 ++++++++-------- src/vs/base/node/crypto.ts | 6 +++--- src/vs/base/node/encoding.ts | 2 +- src/vs/base/node/flow.ts | 10 +++++----- src/vs/base/node/proxy.ts | 6 +++--- src/vs/base/node/stats.ts | 2 +- src/vs/base/node/storage.ts | 28 ++++++++++++++-------------- src/vs/base/node/stream.ts | 10 +++++----- 9 files changed, 54 insertions(+), 40 deletions(-) diff --git a/src/tsconfig.strictNullChecks.json b/src/tsconfig.strictNullChecks.json index 2d17fd87162..3b56efe3bae 100644 --- a/src/tsconfig.strictNullChecks.json +++ b/src/tsconfig.strictNullChecks.json @@ -43,11 +43,18 @@ "./vs/base/browser/ui/splitview/splitview.ts", "./vs/base/browser/ui/tree/tree.ts", "./vs/base/browser/ui/widget.ts", + "./vs/base/node/console.ts", + "./vs/base/node/crypto.ts", "./vs/base/node/decoder.ts", + "./vs/base/node/flow.ts", "./vs/base/node/id.ts", "./vs/base/node/paths.ts", "./vs/base/node/ports.ts", + "./vs/base/node/proxy.ts", "./vs/base/node/request.ts", + "./vs/base/node/stats.ts", + "./vs/base/node/storage.ts", + "./vs/base/node/stream.ts", "./vs/base/parts/contextmenu/common/contextmenu.ts", "./vs/base/parts/contextmenu/electron-browser/contextmenu.ts", "./vs/base/parts/contextmenu/electron-main/contextmenu.ts", @@ -398,6 +405,7 @@ "./vs/vscode.d.ts", "./vs/vscode.proposed.d.ts", "./vs/workbench/api/shared/tasks.ts", + "./vs/workbench/browser/actions/toggleTabsVisibility.ts", "./vs/workbench/browser/part.ts", "./vs/workbench/browser/parts/quickinput/quickInputUtils.ts", "./vs/workbench/browser/parts/quickopen/quickopen.ts", @@ -419,6 +427,10 @@ "./vs/workbench/parts/codeEditor/electron-browser/accessibility.ts", "./vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.ts", "./vs/workbench/parts/codeEditor/electron-browser/selectionClipboard.ts", + "./vs/workbench/parts/codeEditor/electron-browser/toggleMinimap.ts", + "./vs/workbench/parts/codeEditor/electron-browser/toggleMultiCursorModifier.ts", + "./vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.ts", + "./vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.ts", "./vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.ts", "./vs/workbench/parts/comments/common/commentModel.ts", "./vs/workbench/parts/comments/electron-browser/commentGlyphWidget.ts", @@ -428,6 +440,7 @@ "./vs/workbench/parts/extensions/common/extensionQuery.ts", "./vs/workbench/parts/extensions/common/extensions.ts", "./vs/workbench/parts/extensions/common/extensionsFileTemplate.ts", + "./vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts", "./vs/workbench/parts/logs/common/logConstants.ts", "./vs/workbench/parts/markers/electron-browser/constants.ts", "./vs/workbench/parts/markers/electron-browser/markers.ts", @@ -450,6 +463,7 @@ "./vs/workbench/parts/terminal/common/terminalMenu.ts", "./vs/workbench/parts/terminal/node/terminalCommandTracker.ts", "./vs/workbench/parts/terminal/node/terminalEnvironment.ts", + "./vs/workbench/parts/url/electron-browser/url.contribution.ts", "./vs/workbench/parts/webview/electron-browser/webviewProtocols.ts", "./vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.ts", "./vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts", diff --git a/src/vs/base/node/console.ts b/src/vs/base/node/console.ts index 8163beff434..047bca70f27 100644 --- a/src/vs/base/node/console.ts +++ b/src/vs/base/node/console.ts @@ -29,7 +29,7 @@ export function isRemoteConsoleLog(obj: any): obj is IRemoteConsoleLog { export function parse(entry: IRemoteConsoleLog): { args: any[], stack?: string } { const args: any[] = []; - let stack: string; + let stack: string | undefined; // Parse Entry try { @@ -50,11 +50,11 @@ export function parse(entry: IRemoteConsoleLog): { args: any[], stack?: string } return { args, stack }; } -export function getFirstFrame(entry: IRemoteConsoleLog): IStackFrame; -export function getFirstFrame(stack: string): IStackFrame; -export function getFirstFrame(arg0: IRemoteConsoleLog | string): IStackFrame { +export function getFirstFrame(entry: IRemoteConsoleLog): IStackFrame | undefined; +export function getFirstFrame(stack: string | undefined): IStackFrame | undefined; +export function getFirstFrame(arg0: IRemoteConsoleLog | string | undefined): IStackFrame | undefined { if (typeof arg0 !== 'string') { - return getFirstFrame(parse(arg0).stack); + return getFirstFrame(parse(arg0!).stack); } // Parse a source information out of the stack if we have one. Format can be: @@ -73,7 +73,7 @@ export function getFirstFrame(arg0: IRemoteConsoleLog | string): IStackFrame { // (?:(?:[a-zA-Z]+:)|(?:[\/])|(?:\\\\) => windows drive letter OR unix root OR unc root // (?:.+) => simple pattern for the path, only works because of the line/col pattern after // :(?:\d+):(?:\d+) => :line:column data - const matches = /at [^\/]*((?:(?:[a-zA-Z]+:)|(?:[\/])|(?:\\\\))(?:.+)):(\d+):(\d+)/.exec(topFrame); + const matches = /at [^\/]*((?:(?:[a-zA-Z]+:)|(?:[\/])|(?:\\\\))(?:.+)):(\d+):(\d+)/.exec(topFrame || ''); if (matches && matches.length === 4) { return { uri: URI.file(matches[1]), @@ -86,7 +86,7 @@ export function getFirstFrame(arg0: IRemoteConsoleLog | string): IStackFrame { return void 0; } -function findFirstFrame(stack: string): string { +function findFirstFrame(stack: string | undefined): string | undefined { if (!stack) { return stack; } @@ -109,7 +109,7 @@ export function log(entry: IRemoteConsoleLog, label: string): void { topFrame = `(${topFrame.trim()})`; } - let consoleArgs = []; + let consoleArgs: string[] = []; // First arg is a string if (typeof args[0] === 'string') { diff --git a/src/vs/base/node/crypto.ts b/src/vs/base/node/crypto.ts index aa36c56aafe..6e556b97cdf 100644 --- a/src/vs/base/node/crypto.ts +++ b/src/vs/base/node/crypto.ts @@ -10,7 +10,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { once } from 'vs/base/common/functional'; export function checksum(path: string, sha1hash: string): TPromise { - const promise = new TPromise((c, e) => { + const promise = new TPromise((c, e) => { const input = fs.createReadStream(path); const hash = crypto.createHash('sha1'); const hashStream = hash as any as stream.PassThrough; @@ -30,7 +30,7 @@ export function checksum(path: string, sha1hash: string): TPromise { input.once('error', done); input.once('end', done); hashStream.once('error', done); - hashStream.once('data', (data: Buffer) => done(null, data.toString('hex'))); + hashStream.once('data', (data: Buffer) => done(undefined, data.toString('hex'))); }); return promise.then(hash => { @@ -38,6 +38,6 @@ export function checksum(path: string, sha1hash: string): TPromise { return TPromise.wrapError(new Error('Hash mismatch')); } - return TPromise.as(null); + return TPromise.as(void 0); }); } \ No newline at end of file diff --git a/src/vs/base/node/encoding.ts b/src/vs/base/node/encoding.ts index 7bf469abe20..8f9b63fa30b 100644 --- a/src/vs/base/node/encoding.ts +++ b/src/vs/base/node/encoding.ts @@ -142,7 +142,7 @@ function toNodeEncoding(enc: string): string { return enc; } -export function detectEncodingByBOMFromBuffer(buffer: Buffer, bytesRead: number): string { +export function detectEncodingByBOMFromBuffer(buffer: Buffer, bytesRead: number): string | null { if (!buffer || bytesRead < 2) { return null; } diff --git a/src/vs/base/node/flow.ts b/src/vs/base/node/flow.ts index 8d3e918a105..6214d738c0a 100644 --- a/src/vs/base/node/flow.ts +++ b/src/vs/base/node/flow.ts @@ -9,9 +9,9 @@ import * as assert from 'assert'; * Executes the given function (fn) over the given array of items (list) in parallel and returns the resulting errors and results as * array to the callback (callback). The resulting errors and results are evaluated by calling the provided callback function. */ -export function parallel(list: T[], fn: (item: T, callback: (err: Error, result: E) => void) => void, callback: (err: Error[], result: E[]) => void): void { +export function parallel(list: T[], fn: (item: T, callback: (err: Error, result: E) => void) => void, callback: (err: Array | null, result: E[]) => void): void { let results = new Array(list.length); - let errors = new Array(list.length); + let errors = new Array(list.length); let didErrorOccur = false; let doneCount = 0; @@ -42,9 +42,9 @@ export function parallel(list: T[], fn: (item: T, callback: (err: Error, r * array to the callback (callback). The resulting errors and results are evaluated by calling the provided callback function. The first param can * either be a function that returns an array of results to loop in async fashion or be an array of items already. */ -export function loop(param: (callback: (error: Error, result: T[]) => void) => void, fn: (item: T, callback: (error: Error, result: E) => void, index: number, total: number) => void, callback: (error: Error, result: E[]) => void): void; -export function loop(param: T[], fn: (item: T, callback: (error: Error, result: E) => void, index: number, total: number) => void, callback: (error: Error, result: E[]) => void): void; -export function loop(param: any, fn: (item: any, callback: (error: Error, result: E) => void, index: number, total: number) => void, callback: (error: Error, result: E[]) => void): void { +export function loop(param: (callback: (error: Error, result: T[]) => void) => void, fn: (item: T, callback: (error: Error | null, result: E | null) => void, index: number, total: number) => void, callback: (error: Error | null, result: E[] | null) => void): void; +export function loop(param: T[], fn: (item: T, callback: (error: Error | null, result: E | null) => void, index: number, total: number) => void, callback: (error: Error | null, result: E[] | null) => void): void; +export function loop(param: any, fn: (item: any, callback: (error: Error | null, result: E | null) => void, index: number, total: number) => void, callback: (error: Error | null, result: E[] | null) => void): void { // Assert assert.ok(param, 'Missing first parameter'); diff --git a/src/vs/base/node/proxy.ts b/src/vs/base/node/proxy.ts index 6dc5738ac80..2ef6c6768b2 100644 --- a/src/vs/base/node/proxy.ts +++ b/src/vs/base/node/proxy.ts @@ -7,7 +7,7 @@ import { Url, parse as parseUrl } from 'url'; import { isBoolean } from 'vs/base/common/types'; import { Agent } from './request'; -function getSystemProxyURI(requestURL: Url): string { +function getSystemProxyURI(requestURL: Url): string | null { if (requestURL.protocol === 'http:') { return process.env.HTTP_PROXY || process.env.http_proxy || null; } else if (requestURL.protocol === 'https:') { @@ -32,12 +32,12 @@ export async function getProxyAgent(rawRequestURL: string, options: IOptions = { const proxyEndpoint = parseUrl(proxyURL); - if (!/^https?:$/.test(proxyEndpoint.protocol)) { + if (!/^https?:$/.test(proxyEndpoint.protocol || '')) { return null; } const opts = { - host: proxyEndpoint.hostname, + host: proxyEndpoint.hostname || '', port: Number(proxyEndpoint.port), auth: proxyEndpoint.auth, rejectUnauthorized: isBoolean(options.strictSSL) ? options.strictSSL : true diff --git a/src/vs/base/node/stats.ts b/src/vs/base/node/stats.ts index 7c188868ba3..a65797e127a 100644 --- a/src/vs/base/node/stats.ts +++ b/src/vs/base/node/stats.ts @@ -93,7 +93,7 @@ export function collectWorkspaceStats(folder: string, filter: string[]): Promise const MAX_FILES = 20000; function walk(dir: string, filter: string[], token, done: (allFiles: string[]) => void): void { - let results = []; + let results: string[] = []; readdir(dir, async (err, files) => { // Ignore folders that can't be read if (err) { diff --git a/src/vs/base/node/storage.ts b/src/vs/base/node/storage.ts index 9c26e756751..463388df4f5 100644 --- a/src/vs/base/node/storage.ts +++ b/src/vs/base/node/storage.ts @@ -84,7 +84,7 @@ export class Storage extends Disposable { return value; } - getBoolean(key: string, fallbackValue?: boolean): boolean { + getBoolean(key: string, fallbackValue: boolean = false): boolean { const value = this.get(key); if (isUndefinedOrNull(value)) { @@ -94,7 +94,7 @@ export class Storage extends Disposable { return value === 'true'; } - getInteger(key: string, fallbackValue?: number): number { + getInteger(key: string, fallbackValue: number = 0): number { const value = this.get(key); if (isUndefinedOrNull(value)) { @@ -269,7 +269,7 @@ export class SQLiteStorageImpl { return this.transaction(db, () => { if (request.insert && request.insert.size > 0) { this.prepare(db, 'INSERT INTO ItemTable VALUES (?,?)', stmt => { - request.insert.forEach((value, key) => { + request.insert!.forEach((value, key) => { stmt.run([key, value]); }); }); @@ -277,7 +277,7 @@ export class SQLiteStorageImpl { if (request.delete && request.delete.size) { this.prepare(db, 'DELETE FROM ItemTable WHERE key=?', stmt => { - request.delete.forEach(key => { + request.delete!.forEach(key => { stmt.run(key); }); }); @@ -457,35 +457,35 @@ export class SQLiteStorageImpl { } class SQLiteStorageLogger { - private logInfo: boolean; - private logError: boolean; + private readonly logInfo: boolean; + private readonly logError: boolean; - constructor(private options?: IStorageLoggingOptions) { - this.logInfo = this.verbose && options && !!options.infoLogger; - this.logError = options && !!options.errorLogger; + constructor(private readonly options?: IStorageLoggingOptions) { + this.logInfo = !!(this.verbose && options && options.infoLogger); + this.logError = !!(options && options.errorLogger); } get verbose(): boolean { - return this.options && (this.options.info || this.options.trace || this.options.profile); + return !!(this.options && (this.options.info || this.options.trace || this.options.profile)); } get trace(): boolean { - return this.options && this.options.trace; + return !!(this.options && this.options.trace); } get profile(): boolean { - return this.options && this.options.profile; + return !!(this.options && this.options.profile); } info(msg: string): void { if (this.logInfo) { - this.options.infoLogger(msg); + this.options!.infoLogger!(msg); } } error(error: string | Error): void { if (this.logError) { - this.options.errorLogger(error); + this.options!.errorLogger!(error); } } } \ No newline at end of file diff --git a/src/vs/base/node/stream.ts b/src/vs/base/node/stream.ts index ed7f72de7c3..845afdab8e9 100644 --- a/src/vs/base/node/stream.ts +++ b/src/vs/base/node/stream.ts @@ -6,7 +6,7 @@ import * as fs from 'fs'; export interface ReadResult { - buffer: Buffer; + buffer: Buffer | null; bytesRead: number; } @@ -20,7 +20,7 @@ export function readExactlyByFile(file: string, totalBytes: number): Promise { if (closeError) { return reject(closeError); @@ -71,14 +71,14 @@ export function readExactlyByFile(file: string, totalBytes: number): Promise { - return new Promise((resolve, reject) => +export function readToMatchingString(file: string, matchingString: string, chunkBytes: number, maximumBytesToRead: number): Promise { + return new Promise((resolve, reject) => fs.open(file, 'r', null, (err, fd) => { if (err) { return reject(err); } - function end(err: Error, result: string): void { + function end(err: Error | null, result: string | null): void { fs.close(fd, closeError => { if (closeError) { return reject(closeError);