diff --git a/src/util.ts b/src/util.ts
index 1c49bf8..279092c 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -791,7 +791,7 @@
 					atLeastSingleMatch = true;
 					const [, , file, , lineStr, , colStr, msg] = match;
 					const line = +lineStr;
-					const col = +colStr;
+					const col = colStr ? +colStr : undefined;
 
 					// Building skips vendor folders,
 					// But vet and lint take in directories and not import paths, so no way to skip them
@@ -805,7 +805,7 @@
 
 					const filePath = path.resolve(cwd, file);
 					ret.push({ file: filePath, line, col, msg, severity });
-					outputChannel.appendLine(`${filePath}:${line}: ${msg}`);
+					outputChannel.appendLine(`${filePath}:${line}:${col ?? ''} ${msg}`);
 				}
 				if (!atLeastSingleMatch && unexpectedOutput && vscode.window.activeTextEditor) {
 					outputChannel.appendLine(stderr);
@@ -836,21 +836,37 @@
 	diagnosticCollection.clear();
 
 	const diagnosticMap: Map<string, vscode.Diagnostic[]> = new Map();
+
+	const textDocumentMap: Map<string, vscode.TextDocument> = new Map();
+	if (document) {
+		textDocumentMap.set(document.uri.toString(), document);
+	}
+	// Also add other open .go files known to vscode for fast lookup.
+	vscode.workspace.textDocuments.forEach((t) => {
+		const fileName = t.uri.toString();
+		if (!fileName.endsWith('.go')) { return; }
+		textDocumentMap.set(fileName, t);
+	});
+
 	errors.forEach((error) => {
 		const canonicalFile = vscode.Uri.file(error.file).toString();
-		let startColumn = 0;
-		let endColumn = 1;
-		if (document && document.uri.toString() === canonicalFile) {
+		let startColumn = error.col ? error.col - 1 : 0;
+		let endColumn = startColumn + 1;
+		// Some tools output only the line number or the start position.
+		// If the file content is available, adjust the diagnostic range so
+		// the squiggly underline for the error message is more visible.
+		const doc = textDocumentMap.get(canonicalFile);
+		if (doc) {
 			const tempRange = new vscode.Range(
 				error.line - 1,
 				0,
 				error.line - 1,
-				document.lineAt(error.line - 1).range.end.character + 1
+				doc.lineAt(error.line - 1).range.end.character + 1  // end of the line
 			);
-			const text = document.getText(tempRange);
+			const text = doc.getText(tempRange);
 			const [_, leading, trailing] = /^(\s*).*(\s*)$/.exec(text);
 			if (!error.col) {
-				startColumn = leading.length;
+				startColumn = leading.length;  // beginning of the non-white space.
 			} else {
 				startColumn = error.col - 1; // range is 0-indexed
 			}
@@ -873,20 +889,20 @@
 
 		if (diagnosticCollection === buildDiagnosticCollection) {
 			// If there are lint/vet warnings on current file, remove the ones co-inciding with the new build errors
-			if (lintDiagnosticCollection.has(fileUri)) {
+			if (lintDiagnosticCollection && lintDiagnosticCollection.has(fileUri)) {
 				lintDiagnosticCollection.set(
 					fileUri,
 					deDupeDiagnostics(newDiagnostics, lintDiagnosticCollection.get(fileUri).slice())
 				);
 			}
 
-			if (vetDiagnosticCollection.has(fileUri)) {
+			if (vetDiagnosticCollection && vetDiagnosticCollection.has(fileUri)) {
 				vetDiagnosticCollection.set(
 					fileUri,
 					deDupeDiagnostics(newDiagnostics, vetDiagnosticCollection.get(fileUri).slice())
 				);
 			}
-		} else if (buildDiagnosticCollection.has(fileUri)) {
+		} else if (buildDiagnosticCollection && buildDiagnosticCollection.has(fileUri)) {
 			// If there are build errors on current file, ignore the new lint/vet warnings co-inciding with them
 			newDiagnostics = deDupeDiagnostics(buildDiagnosticCollection.get(fileUri).slice(), newDiagnostics);
 		}
diff --git a/test/integration/extension.test.ts b/test/integration/extension.test.ts
index 1b42970..385e554 100644
--- a/test/integration/extension.test.ts
+++ b/test/integration/extension.test.ts
@@ -35,6 +35,7 @@
 	getGoConfig,
 	getImportPath,
 	getToolsGopath,
+	handleDiagnosticErrors,
 	ICheckResult,
 	isVendorSupported
 } from '../../src/util';
@@ -386,6 +387,29 @@
 		assert.equal(processutil.killProcessTree.callCount, 1, 'should have killed 1 lint job before launching the next');
 	});
 
+	test('Linting - lint errors with multiple open files', async () => {
+		// handleDiagnosticErrors may adjust the lint errors' ranges to make the error more visible.
+		// This adjustment applies only to the text documents known to vscode. This test checks
+		// the adjustment is made consistently across multiple open text documents.
+		const file1 = await vscode.workspace.openTextDocument(vscode.Uri.file(path.join(fixturePath, 'linterTest', 'linter_1.go')));
+		const file2 = await vscode.workspace.openTextDocument(vscode.Uri.file(path.join(fixturePath, 'linterTest', 'linter_2.go')));
+		const warnings = await goLint(file2.uri, Object.create(vscode.workspace.getConfiguration('go'), {
+			lintTool: { value: 'golint' },
+			lintFlags: { value: [] }
+		}), 'package');
+
+		const diagnosticCollection = vscode.languages.createDiagnosticCollection('linttest');
+		handleDiagnosticErrors(file2, warnings, diagnosticCollection);
+
+		// The first diagnostic message for each file should be about the use of MixedCaps in package name.
+		// Both files belong to the same package name, and we want them to be identical.
+		const file1Diagnostics = diagnosticCollection.get(file1.uri);
+		const file2Diagnostics = diagnosticCollection.get(file2.uri);
+		assert(file1Diagnostics.length > 0);
+		assert(file2Diagnostics.length > 0);
+		assert.deepStrictEqual(file1Diagnostics[0], file2Diagnostics[0]);
+	});
+
 	test('Error checking', async () => {
 		const config = Object.create(vscode.workspace.getConfiguration('go'), {
 			vetOnSave: { value: 'package' },
