Fix errors resulting from strictNullCheck
diff --git a/src/diffUtils.ts b/src/diffUtils.ts
index 5310b8b..3da3bc8 100644
--- a/src/diffUtils.ts
+++ b/src/diffUtils.ts
@@ -4,14 +4,17 @@
  *--------------------------------------------------------*/
 
 import jsDiff = require('diff');
-import { Position, Range, TextEdit, TextEditorEdit, Uri, WorkspaceEdit } from 'vscode';
+import { Position, Range, TextEditorEdit, Uri, WorkspaceEdit } from 'vscode';
 import { getBinPathFromEnvVar } from './goPath';
 
-let diffToolAvailable: boolean = null;
+let diffToolAvailable: boolean | null = null;
 
 export function isDiffToolAvailable(): boolean {
 	if (diffToolAvailable == null) {
 		const envPath = process.env['PATH'] || (process.platform === 'win32' ? process.env['Path'] : null);
+		if (!envPath) {
+			return false;
+		}
 		diffToolAvailable = getBinPathFromEnvVar('diff', envPath, false) != null;
 	}
 	return diffToolAvailable;
@@ -35,20 +38,6 @@
 		this.text = '';
 	}
 
-	// Creates TextEdit for current Edit
-	public apply(): TextEdit {
-		switch (this.action) {
-			case EditTypes.EDIT_INSERT:
-				return TextEdit.insert(this.start, this.text);
-
-			case EditTypes.EDIT_DELETE:
-				return TextEdit.delete(new Range(this.start, this.end));
-
-			case EditTypes.EDIT_REPLACE:
-				return TextEdit.replace(new Range(this.start, this.end), this.text);
-		}
-	}
-
 	// Applies Edit using given TextEditorEdit
 	public applyUsingTextEditorEdit(editBuilder: TextEditorEdit): void {
 		switch (this.action) {
@@ -99,7 +88,7 @@
 function parseUniDiffs(diffOutput: jsDiff.IUniDiff[]): FilePatch[] {
 	const filePatches: FilePatch[] = [];
 	diffOutput.forEach((uniDiff: jsDiff.IUniDiff) => {
-		let edit: Edit = null;
+		let edit: Edit;
 		const edits: Edit[] = [];
 		uniDiff.hunks.forEach((hunk: jsDiff.IHunk) => {
 			let startLine = hunk.oldStart;
diff --git a/src/goBrowsePackage.ts b/src/goBrowsePackage.ts
index 755e448..15f4079 100644
--- a/src/goBrowsePackage.ts
+++ b/src/goBrowsePackage.ts
@@ -14,11 +14,10 @@
 
 export function browsePackages() {
 	let workDir = '';
-	let currentUri: vscode.Uri = null;
 	let selectedText = '';
 	const editor = vscode.window.activeTextEditor;
 	if (editor) {
-		currentUri = vscode.window.activeTextEditor.document.uri;
+		const currentUri = editor.document.uri;
 		workDir = path.dirname(currentUri.fsPath);
 		const selection = editor.selection;
 		if (!selection.isEmpty) {
@@ -30,7 +29,7 @@
 		}
 		selectedText = getImportPath(selectedText) || selectedText.trim();
 	} else if (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length === 1) {
-		currentUri = vscode.workspace.workspaceFolders[0].uri;
+		const currentUri = vscode.workspace.workspaceFolders[0].uri;
 		workDir = currentUri.fsPath;
 	}
 
diff --git a/src/goCover.ts b/src/goCover.ts
index 45b22d4..2ad8e54 100644
--- a/src/goCover.ts
+++ b/src/goCover.ts
@@ -54,22 +54,28 @@
 	// Update the coverageDecorator in User config, if they are using the old style.
 	const goConfig = getGoConfig();
 	const inspectResult = goConfig.inspect('coverageDecorator');
-	if (typeof inspectResult.globalValue === 'string') {
-		goConfig.update('coverageDecorator', { type: inspectResult.globalValue }, vscode.ConfigurationTarget.Global);
-	}
-	if (typeof inspectResult.workspaceValue === 'string') {
-		goConfig.update(
-			'coverageDecorator',
-			{ type: inspectResult.workspaceValue },
-			vscode.ConfigurationTarget.Workspace
-		);
-	}
-	if (typeof inspectResult.workspaceFolderValue === 'string') {
-		goConfig.update(
-			'coverageDecorator',
-			{ type: inspectResult.workspaceValue },
-			vscode.ConfigurationTarget.WorkspaceFolder
-		);
+	if (inspectResult) {
+		if (typeof inspectResult.globalValue === 'string') {
+			goConfig.update(
+				'coverageDecorator',
+				{ type: inspectResult.globalValue },
+				vscode.ConfigurationTarget.Global
+			);
+		}
+		if (typeof inspectResult.workspaceValue === 'string') {
+			goConfig.update(
+				'coverageDecorator',
+				{ type: inspectResult.workspaceValue },
+				vscode.ConfigurationTarget.Workspace
+			);
+		}
+		if (typeof inspectResult.workspaceFolderValue === 'string') {
+			goConfig.update(
+				'coverageDecorator',
+				{ type: inspectResult.workspaceValue },
+				vscode.ConfigurationTarget.WorkspaceFolder
+			);
+		}
 	}
 
 	// Update the decorators
diff --git a/src/goDebugConfiguration.ts b/src/goDebugConfiguration.ts
index 97fd0e3..a9b50a5 100644
--- a/src/goDebugConfiguration.ts
+++ b/src/goDebugConfiguration.ts
@@ -58,7 +58,7 @@
 

 		debugConfiguration['packagePathToGoModPathMap'] = packagePathToGoModPathMap;

 

-		const gopath = getCurrentGoPath(folder ? folder.uri : null);

+		const gopath = getCurrentGoPath(folder ? folder.uri : undefined);

 		if (!debugConfiguration['env']) {

 			debugConfiguration['env'] = { GOPATH: gopath };

 		} else if (!debugConfiguration['env']['GOPATH']) {

@@ -73,7 +73,7 @@
 			}

 		});

 

-		const dlvConfig: { [key: string]: any } = goConfig.get('delveConfig');

+		const dlvConfig = goConfig.get<any>('delveConfig');

 		let useApiV1 = false;

 		if (debugConfiguration.hasOwnProperty('useApiV1')) {

 			useApiV1 = debugConfiguration['useApiV1'] === true;

diff --git a/src/goExtraInfo.ts b/src/goExtraInfo.ts
index d34da6d..8775c66 100644
--- a/src/goExtraInfo.ts
+++ b/src/goExtraInfo.ts
@@ -11,7 +11,7 @@
 import { getGoConfig } from './util';
 
 export class GoHoverProvider implements HoverProvider {
-	private goConfig: WorkspaceConfiguration = null;
+	private goConfig: WorkspaceConfiguration | undefined;
 
 	constructor(goConfig?: WorkspaceConfiguration) {
 		this.goConfig = goConfig;
diff --git a/src/goFillStruct.ts b/src/goFillStruct.ts
index ec68eaf..dddc3eb 100644
--- a/src/goFillStruct.ts
+++ b/src/goFillStruct.ts
@@ -26,7 +26,7 @@
 	return execFillStruct(editor, args);
 }
 
-function getCommonArgs(editor: vscode.TextEditor): string[] {
+function getCommonArgs(editor: vscode.TextEditor): string[] | undefined {
 	if (!editor) {
 		vscode.window.showInformationMessage('No editor is active.');
 		return;
@@ -50,7 +50,7 @@
 function getTabsCount(editor: vscode.TextEditor): number {
 	const startline = editor.selection.start.line;
 	const tabs = editor.document.lineAt(startline).text.match('^\t*');
-	return tabs.length;
+	return tabs ? tabs.length : 0;
 }
 
 function execFillStruct(editor: vscode.TextEditor, args: string[]): Promise<void> {
diff --git a/src/goGenerateTests.ts b/src/goGenerateTests.ts
index 9fcc111..97cf776 100644
--- a/src/goGenerateTests.ts
+++ b/src/goGenerateTests.ts
@@ -19,7 +19,7 @@
 /**
  * If current active editor has a Go file, returns the editor.
  */
-function checkActiveEditor(): vscode.TextEditor {
+function checkActiveEditor(): vscode.TextEditor | undefined {
 	const editor = vscode.window.activeTextEditor;
 	if (!editor) {
 		vscode.window.showInformationMessage('Cannot generate unit tests. No editor selected.');
diff --git a/src/goImpl.ts b/src/goImpl.ts
index f0d0d29..fb743e1 100644
--- a/src/goImpl.ts
+++ b/src/goImpl.ts
@@ -15,7 +15,12 @@
 const inputRegex = /^(\w+\ \*?\w+\ )?([\w./]+)$/;
 
 export function implCursor() {
-	const cursor = vscode.window.activeTextEditor.selection;
+	const editor = vscode.window.activeTextEditor;
+	if (!editor) {
+		vscode.window.showErrorMessage('No active editor found.');
+		return;
+	}
+	const cursor = editor.selection;
 	return vscode.window
 		.showInputBox({
 			placeHolder: 'f *File io.Closer',
@@ -35,16 +40,16 @@
 			// if matches[1] is undefined then detect receiver type
 			// take first character and use as receiver name
 
-			runGoImpl([matches[1], matches[2]], cursor.start);
+			runGoImpl([matches[1], matches[2]], cursor.start, editor);
 		});
 }
 
-function runGoImpl(args: string[], insertPos: vscode.Position) {
+function runGoImpl(args: string[], insertPos: vscode.Position, editor: vscode.TextEditor) {
 	const goimpl = getBinPath('impl');
 	const p = cp.execFile(
 		goimpl,
 		args,
-		{ env: getToolsEnvVars(), cwd: dirname(vscode.window.activeTextEditor.document.fileName) },
+		{ env: getToolsEnvVars(), cwd: dirname(editor.document.fileName) },
 		(err, stdout, stderr) => {
 			if (err && (<any>err).code === 'ENOENT') {
 				promptForMissingTool('impl');
@@ -56,7 +61,7 @@
 				return;
 			}
 
-			vscode.window.activeTextEditor.edit((editBuilder) => {
+			editor.edit((editBuilder) => {
 				editBuilder.insert(insertPos, stdout);
 			});
 		}
diff --git a/src/goImport.ts b/src/goImport.ts
index 7fa2408..82627d6 100644
--- a/src/goImport.ts
+++ b/src/goImport.ts
@@ -60,7 +60,7 @@
 	return imports;
 }
 
-async function askUserForImport(): Promise<string> {
+async function askUserForImport(): Promise<string | undefined> {
 	try {
 		const packages = await listPackages(true);
 		return vscode.window.showQuickPick(packages);
@@ -120,13 +120,21 @@
 }
 
 export function addImport(arg: { importPath: string; from: string }) {
+	const editor = vscode.window.activeTextEditor;
+	if (!editor) {
+		vscode.window.showErrorMessage('No active editor found to add imports.');
+		return;
+	}
 	const p = arg && arg.importPath ? Promise.resolve(arg.importPath) : askUserForImport();
 	p.then((imp) => {
+		if (!imp) {
+			return;
+		}
 		sendTelemetryEventForAddImportCmd(arg);
 		const edits = getTextEditForAddImport(imp);
 		if (edits && edits.length > 0) {
 			const edit = new vscode.WorkspaceEdit();
-			edit.set(vscode.window.activeTextEditor.document.uri, edits);
+			edit.set(editor.document.uri, edits);
 			vscode.workspace.applyEdit(edit);
 		}
 	});
@@ -134,6 +142,10 @@
 
 export function addImportToWorkspace() {
 	const editor = vscode.window.activeTextEditor;
+	if (!editor) {
+		vscode.window.showErrorMessage('No active editor found to determine current package.');
+		return;
+	}
 	const selection = editor.selection;
 
 	let importPath = '';
diff --git a/src/goReferencesCodelens.ts b/src/goReferencesCodelens.ts
index a24ad55..546280b 100644
--- a/src/goReferencesCodelens.ts
+++ b/src/goReferencesCodelens.ts
@@ -26,7 +26,7 @@
 		if (!this.enabled) {
 			return [];
 		}
-		const codeLensConfig: { [key: string]: any } = getGoConfig(document.uri).get('enableCodeLens');
+		const codeLensConfig = getGoConfig(document.uri).get<{ [key: string]: any }>('enableCodeLens');
 		const codelensEnabled = codeLensConfig ? codeLensConfig['references'] : false;
 		if (!codelensEnabled) {
 			return Promise.resolve([]);
diff --git a/src/goRename.ts b/src/goRename.ts
index 518e269..3bb0400 100644
--- a/src/goRename.ts
+++ b/src/goRename.ts
@@ -56,7 +56,7 @@
 				try {
 					if (err && (<any>err).code === 'ENOENT') {
 						promptForMissingTool('gorename');
-						return resolve(null);
+						return reject('Could not find gorename tool.');
 					}
 					if (err) {
 						const errMsg = stderr ? 'Rename failed: ' + stderr.replace(/\n/g, ' ') : 'Rename failed';
diff --git a/src/goRunTestCodelens.ts b/src/goRunTestCodelens.ts
index 749a72d..e79ab60 100644
--- a/src/goRunTestCodelens.ts
+++ b/src/goRunTestCodelens.ts
@@ -29,7 +29,7 @@
 			return [];
 		}
 		const config = getGoConfig(document.uri);
-		const codeLensConfig: { [key: string]: any } = config.get('enableCodeLens');
+		const codeLensConfig = config.get<{ [key: string]: any }>('enableCodeLens');
 		const codelensEnabled = codeLensConfig ? codeLensConfig['runtest'] : false;
 		if (!codelensEnabled || !document.fileName.endsWith('_test.go')) {
 			return [];
@@ -55,7 +55,7 @@
 		const symbols = await documentSymbolProvider.provideDocumentSymbols(document, token);
 		const pkg = symbols[0];
 		if (!pkg) {
-			return;
+			return [];
 		}
 		const range = pkg.range;
 		const packageCodeLens = [
diff --git a/src/telemetry.ts b/src/telemetry.ts
index 14bcb97..5f789aa 100644
--- a/src/telemetry.ts
+++ b/src/telemetry.ts
@@ -7,7 +7,8 @@
 import TelemetryReporter from 'vscode-extension-telemetry';
 
 export const extensionId: string = 'ms-vscode.Go';
-const extensionVersion: string = vscode.extensions.getExtension(extensionId).packageJSON.version;
+const extension = vscode.extensions.getExtension(extensionId);
+const extensionVersion: string = extension ? extension.packageJSON.version : '';
 const aiKey: string = 'AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217';
 
 export function sendTelemetryEventForModulesUsage() {