From 8a6778cecc020fa438446ade9a9030b399e988ff Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 22 Oct 2018 16:20:36 -0700 Subject: [PATCH] Strict null checks #60565 --- src/tsconfig.strictNullChecks.json | 9 ++++++++ .../logs/electron-browser/logsActions.ts | 2 +- .../parts/output/common/outputLinkComputer.ts | 23 +++++++++++-------- .../parts/tasks/common/problemCollectors.ts | 16 ++++++------- src/vs/workbench/parts/tasks/common/tasks.ts | 8 +++---- .../parts/terminal/common/terminal.ts | 4 ++-- .../parts/terminal/common/terminalService.ts | 13 +++++++---- .../common/configurationExtensionPoint.ts | 2 +- .../inactiveExtensionUrlHandler.ts | 8 +++---- 9 files changed, 50 insertions(+), 35 deletions(-) diff --git a/src/tsconfig.strictNullChecks.json b/src/tsconfig.strictNullChecks.json index 59d1108e049..96b05195cac 100644 --- a/src/tsconfig.strictNullChecks.json +++ b/src/tsconfig.strictNullChecks.json @@ -505,6 +505,8 @@ "./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/logs/electron-browser/logs.contribution.ts", + "./vs/workbench/parts/logs/electron-browser/logsActions.ts", "./vs/workbench/parts/markers/electron-browser/constants.ts", "./vs/workbench/parts/markers/electron-browser/markers.ts", "./vs/workbench/parts/markers/electron-browser/markersFileDecorations.ts", @@ -513,6 +515,7 @@ "./vs/workbench/parts/markers/electron-browser/messages.ts", "./vs/workbench/parts/outline/electron-browser/outline.ts", "./vs/workbench/parts/output/common/output.ts", + "./vs/workbench/parts/output/common/outputLinkComputer.ts", "./vs/workbench/parts/performance/electron-browser/stats.ts", "./vs/workbench/parts/preferences/common/smartSnippetInserter.ts", "./vs/workbench/parts/scm/common/scm.ts", @@ -520,14 +523,18 @@ "./vs/workbench/parts/search/common/constants.ts", "./vs/workbench/parts/search/common/queryBuilder.ts", "./vs/workbench/parts/surveys/electron-browser/nps.contribution.ts", + "./vs/workbench/parts/tasks/common/problemCollectors.ts", "./vs/workbench/parts/tasks/common/problemMatcher.ts", + "./vs/workbench/parts/tasks/common/taskSystem.ts", "./vs/workbench/parts/tasks/common/taskTemplates.ts", + "./vs/workbench/parts/tasks/common/tasks.ts", "./vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.ts", "./vs/workbench/parts/terminal/browser/terminalWidgetManager.ts", "./vs/workbench/parts/terminal/common/terminal.ts", "./vs/workbench/parts/terminal/common/terminalColorRegistry.ts", "./vs/workbench/parts/terminal/common/terminalCommands.ts", "./vs/workbench/parts/terminal/common/terminalMenu.ts", + "./vs/workbench/parts/terminal/common/terminalService.ts", "./vs/workbench/parts/terminal/node/terminalCommandTracker.ts", "./vs/workbench/parts/terminal/node/terminalEnvironment.ts", "./vs/workbench/parts/url/electron-browser/url.contribution.ts", @@ -540,11 +547,13 @@ "./vs/workbench/services/backup/common/backup.ts", "./vs/workbench/services/commands/common/commandService.ts", "./vs/workbench/services/configuration/common/configuration.ts", + "./vs/workbench/services/configuration/common/configurationExtensionPoint.ts", "./vs/workbench/services/configuration/common/jsonEditing.ts", "./vs/workbench/services/configurationResolver/common/configurationResolver.ts", "./vs/workbench/services/decorations/browser/decorations.ts", "./vs/workbench/services/extensions/common/extensions.ts", "./vs/workbench/services/extensions/common/extensionsRegistry.ts", + "./vs/workbench/services/extensions/electron-browser/inactiveExtensionUrlHandler.ts", "./vs/workbench/services/extensions/node/extensionDescriptionRegistry.ts", "./vs/workbench/services/extensions/node/extensionManagementServerService.ts", "./vs/workbench/services/extensions/node/lazyPromise.ts", diff --git a/src/vs/workbench/parts/logs/electron-browser/logsActions.ts b/src/vs/workbench/parts/logs/electron-browser/logsActions.ts index bfaf241b326..d0f67b0ace2 100644 --- a/src/vs/workbench/parts/logs/electron-browser/logsActions.ts +++ b/src/vs/workbench/parts/logs/electron-browser/logsActions.ts @@ -60,7 +60,7 @@ export class SetLogLevelAction extends Action { }); } - private getDescription(level: LogLevel, current: LogLevel): string { + private getDescription(level: LogLevel, current: LogLevel): string | undefined { if (DEFAULT_LOG_LEVEL === level && current === level) { return nls.localize('default and current', "Default & Current"); } diff --git a/src/vs/workbench/parts/output/common/outputLinkComputer.ts b/src/vs/workbench/parts/output/common/outputLinkComputer.ts index 081ab8a0da7..012e4faf41f 100644 --- a/src/vs/workbench/parts/output/common/outputLinkComputer.ts +++ b/src/vs/workbench/parts/output/common/outputLinkComputer.ts @@ -17,7 +17,7 @@ export interface ICreateData { } export interface IResourceCreator { - toResource: (folderRelativePath: string) => URI; + toResource: (folderRelativePath: string) => URI | null; } export class OutputLinkComputer { @@ -43,7 +43,7 @@ export class OutputLinkComputer { }); } - private getModel(uri: string): IMirrorModel { + private getModel(uri: string): IMirrorModel | null { const models = this.ctx.getMirrorModels(); for (let i = 0; i < models.length; i++) { const model = models[i]; @@ -55,7 +55,7 @@ export class OutputLinkComputer { return null; } - public computeLinks(uri: string): Promise { + public computeLinks(uri: string): Promise | undefined { const model = this.getModel(uri); if (!model) { return void 0; @@ -67,7 +67,7 @@ export class OutputLinkComputer { // For each workspace root patterns this.patterns.forEach((folderPatterns, folderUri) => { const resourceCreator: IResourceCreator = { - toResource: (folderRelativePath: string): URI => { + toResource: (folderRelativePath: string): URI | null => { if (typeof folderRelativePath === 'string') { return resources.joinPath(folderUri, folderRelativePath); } @@ -130,15 +130,18 @@ export class OutputLinkComputer { patterns.forEach(pattern => { pattern.lastIndex = 0; // the holy grail of software development - let match: RegExpExecArray; + let match: RegExpExecArray | null; let offset = 0; while ((match = pattern.exec(line)) !== null) { // Convert the relative path information to a resource that we can use in links const folderRelativePath = strings.rtrim(match[1], '.').replace(/\\/g, '/'); // remove trailing "." that likely indicate end of sentence - let resource: string; + let resourceString: string | undefined; try { - resource = resourceCreator.toResource(folderRelativePath).toString(); + const resource = resourceCreator.toResource(folderRelativePath); + if (resource) { + resourceString = resource.toString(); + } } catch (error) { continue; // we might find an invalid URI and then we dont want to loose all other links } @@ -149,9 +152,9 @@ export class OutputLinkComputer { if (match[5]) { const columnNumber = match[5]; - resource = strings.format('{0}#{1},{2}', resource, lineNumber, columnNumber); + resourceString = strings.format('{0}#{1},{2}', resourceString, lineNumber, columnNumber); } else { - resource = strings.format('{0}#{1}', resource, lineNumber); + resourceString = strings.format('{0}#{1}', resourceString, lineNumber); } } @@ -173,7 +176,7 @@ export class OutputLinkComputer { links.push({ range: linkRange, - url: resource + url: resourceString }); } }); diff --git a/src/vs/workbench/parts/tasks/common/problemCollectors.ts b/src/vs/workbench/parts/tasks/common/problemCollectors.ts index 98c2c309454..08b3b3d7b0a 100644 --- a/src/vs/workbench/parts/tasks/common/problemCollectors.ts +++ b/src/vs/workbench/parts/tasks/common/problemCollectors.ts @@ -36,9 +36,9 @@ export interface IProblemMatcher { export class AbstractProblemCollector implements IDisposable { private matchers: INumberDictionary; - private activeMatcher: ILineMatcher; + private activeMatcher: ILineMatcher | null; private _numberOfMatches: number; - private _maxMarkerSeverity: MarkerSeverity; + private _maxMarkerSeverity?: MarkerSeverity; private buffer: string[]; private bufferLength: number; private openModels: IStringDictionary; @@ -111,11 +111,11 @@ export class AbstractProblemCollector implements IDisposable { return this._numberOfMatches; } - public get maxMarkerSeverity(): MarkerSeverity { + public get maxMarkerSeverity(): MarkerSeverity | undefined { return this._maxMarkerSeverity; } - protected tryFindMarker(line: string): ProblemMatch { + protected tryFindMarker(line: string): ProblemMatch | null { let result: ProblemMatch | null = null; if (this.activeMatcher) { result = this.activeMatcher.next(line); @@ -163,7 +163,7 @@ export class AbstractProblemCollector implements IDisposable { return ApplyToKind.allDocuments; } - private tryMatchers(): ProblemMatch { + private tryMatchers(): ProblemMatch | null { this.activeMatcher = null; let length = this.buffer.length; for (let startIndex = 0; startIndex < length; startIndex++) { @@ -384,8 +384,8 @@ export class WatchingProblemCollector extends AbstractProblemCollector implement private _activeBackgroundMatchers: Set; // Current State - private currentOwner: string; - private currentResource: string; + private currentOwner: string | null; + private currentResource: string | null; constructor(problemMatchers: ProblemMatcher[], markerService: IMarkerService, modelService: IModelService) { super(problemMatchers, markerService, modelService); @@ -458,7 +458,7 @@ export class WatchingProblemCollector extends AbstractProblemCollector implement this.cleanMarkerCaches(); this.resetCurrentResource(); let owner = background.matcher.owner; - let file = matches[background.begin.file]; + let file = matches[background.begin.file!]; if (file) { let resource = getResource(file, background.matcher); this.recordResourceToClean(owner, resource); diff --git a/src/vs/workbench/parts/tasks/common/tasks.ts b/src/vs/workbench/parts/tasks/common/tasks.ts index 6a2fe0a492f..e29cc900723 100644 --- a/src/vs/workbench/parts/tasks/common/tasks.ts +++ b/src/vs/workbench/parts/tasks/common/tasks.ts @@ -474,7 +474,7 @@ export namespace CustomTask { }; return result; } - export function customizes(task: CustomTask): KeyedTaskIdentifier { + export function customizes(task: CustomTask): KeyedTaskIdentifier | undefined { if (task._source && task._source.customizes) { return task._source.customizes; } @@ -641,7 +641,7 @@ export namespace Task { } } - export function getTaskDefinition(task: Task, useSource: boolean = false): KeyedTaskIdentifier { + export function getTaskDefinition(task: Task, useSource: boolean = false): KeyedTaskIdentifier | undefined { if (ContributedTask.is(task)) { return task.defines; } else if (CustomTask.is(task)) { @@ -769,8 +769,8 @@ export namespace TaskEvent { taskName: task.name, runType: task.isBackground ? TaskRunType.Background : TaskRunType.SingleRun, group: task.group, - processId: undefined, - exitCode: undefined, + processId: undefined as number | undefined, + exitCode: undefined as number | undefined, __task: task, }; if (kind === TaskEventKind.ProcessStarted) { diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 80caa09bead..52af8e05b67 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -215,13 +215,13 @@ export interface ITerminalService { getInstanceFromId(terminalId: number): ITerminalInstance; getInstanceFromIndex(terminalIndex: number): ITerminalInstance; getTabLabels(): string[]; - getActiveInstance(): ITerminalInstance; + getActiveInstance(): ITerminalInstance | null; setActiveInstance(terminalInstance: ITerminalInstance): void; setActiveInstanceByIndex(terminalIndex: number): void; getActiveOrCreateInstance(wasNewTerminalAction?: boolean): ITerminalInstance; splitInstance(instance: ITerminalInstance, shell?: IShellLaunchConfig): void; - getActiveTab(): ITerminalTab; + getActiveTab(): ITerminalTab | null; setActiveTabToNext(): void; setActiveTabToPrevious(): void; setActiveTabByIndex(tabIndex: number): void; diff --git a/src/vs/workbench/parts/terminal/common/terminalService.ts b/src/vs/workbench/parts/terminal/common/terminalService.ts index 7108b21f38f..91d353aa7bc 100644 --- a/src/vs/workbench/parts/terminal/common/terminalService.ts +++ b/src/vs/workbench/parts/terminal/common/terminalService.ts @@ -139,7 +139,10 @@ export abstract class TerminalService implements ITerminalService { // const hasFocusOnExit = tab.activeInstance.hadFocusOnExit; const newIndex = index < this._terminalTabs.length ? index : this._terminalTabs.length - 1; this.setActiveTabByIndex(newIndex); - this.getActiveInstance().focus(true); + const activeInstance = this.getActiveInstance(); + if (activeInstance) { + activeInstance.focus(true); + } } // Hide the panel if there are no more instances, provided that VS Code is not shutting @@ -157,14 +160,14 @@ export abstract class TerminalService implements ITerminalService { } } - public getActiveTab(): ITerminalTab { + public getActiveTab(): ITerminalTab | null { if (this._activeTabIndex < 0 || this._activeTabIndex >= this._terminalTabs.length) { return null; } return this._terminalTabs[this._activeTabIndex]; } - public getActiveInstance(): ITerminalInstance { + public getActiveInstance(): ITerminalInstance | null { const tab = this.getActiveTab(); if (!tab) { return null; @@ -198,7 +201,7 @@ export abstract class TerminalService implements ITerminalService { } } - private _getInstanceFromGlobalInstanceIndex(index: number): { tab: ITerminalTab, tabIndex: number, instance: ITerminalInstance, localInstanceIndex: number } { + private _getInstanceFromGlobalInstanceIndex(index: number): { tab: ITerminalTab, tabIndex: number, instance: ITerminalInstance, localInstanceIndex: number } | null { let currentTabIndex = 0; while (index >= 0 && currentTabIndex < this._terminalTabs.length) { const tab = this._terminalTabs[currentTabIndex]; @@ -281,7 +284,7 @@ export abstract class TerminalService implements ITerminalService { instance.addDisposable(instance.onFocus(this._onActiveInstanceChanged.fire, this._onActiveInstanceChanged)); } - private _getTabForInstance(instance: ITerminalInstance): ITerminalTab { + private _getTabForInstance(instance: ITerminalInstance): ITerminalTab | null { for (let i = 0; i < this._terminalTabs.length; i++) { const tab = this._terminalTabs[i]; if (tab.terminalInstances.indexOf(instance) !== -1) { diff --git a/src/vs/workbench/services/configuration/common/configurationExtensionPoint.ts b/src/vs/workbench/services/configuration/common/configurationExtensionPoint.ts index 27fce4bea94..0f83fe3d726 100644 --- a/src/vs/workbench/services/configuration/common/configurationExtensionPoint.ts +++ b/src/vs/workbench/services/configuration/common/configurationExtensionPoint.ts @@ -160,7 +160,7 @@ function validateProperties(configuration: IConfigurationNode, extension: IExten extension.collector.warn(message); continue; } - const propertyConfiguration = configuration.properties[key]; + const propertyConfiguration = properties[key]; if (!isObject(propertyConfiguration)) { delete properties[key]; extension.collector.error(nls.localize('invalid.property', "'configuration.property' must be an object")); diff --git a/src/vs/workbench/services/extensions/electron-browser/inactiveExtensionUrlHandler.ts b/src/vs/workbench/services/extensions/electron-browser/inactiveExtensionUrlHandler.ts index d667af60c1b..3121a2182d5 100644 --- a/src/vs/workbench/services/extensions/electron-browser/inactiveExtensionUrlHandler.ts +++ b/src/vs/workbench/services/extensions/electron-browser/inactiveExtensionUrlHandler.ts @@ -13,7 +13,7 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { localize } from 'vs/nls'; import { IExtensionManagementService, IExtensionIdentifier, IExtensionEnablementService, EnablementState, IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; +import { INotificationService, Severity, INotificationHandle } from 'vs/platform/notification/common/notification'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { Action } from 'vs/base/common/actions'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; @@ -184,7 +184,7 @@ export class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { detail: `${extension.manifest.displayName || extension.manifest.name} (${extensionIdentifier.id}) wants to open a URL:\n\n${uri.toString()}`, primaryButton: localize('enableAndReload', "&&Enable and Open"), type: 'question' - }).then(result => { + }).then((result): TPromise | null => { if (result.confirmed) { return this.extensionEnablementService.setEnablement(extension, EnablementState.Enabled) .then(() => this.reloadAndHandle(uri)); @@ -206,7 +206,7 @@ export class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { type: 'question' }).then(async result => { if (result.confirmed) { - let notificationHandle = this.notificationService.notify({ severity: Severity.Info, message: localize('Installing', "Installing Extension '{0}'...", galleryExtension.displayName || galleryExtension.name) }); + let notificationHandle: INotificationHandle | null = this.notificationService.notify({ severity: Severity.Info, message: localize('Installing', "Installing Extension '{0}'...", galleryExtension.displayName || galleryExtension.name) }); notificationHandle.progress.infinite(); notificationHandle.onDidClose(() => notificationHandle = null); try { @@ -217,7 +217,7 @@ export class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { notificationHandle.progress.done(); notificationHandle.updateMessage(reloadMessage); notificationHandle.updateActions({ - primary: [new Action('reloadWindow', reloadActionLabel, null, true, () => this.reloadAndHandle(uri))] + primary: [new Action('reloadWindow', reloadActionLabel, undefined, true, () => this.reloadAndHandle(uri))] }); } else { this.notificationService.prompt(Severity.Info, reloadMessage,