src/config: move getGoConfig/getGoplsConfig to config

And let them use the new Configuration class

For golang/vscode-go#1094

Change-Id: I96d0cc32b6499e59d1062c2b04031bc675703a24
Reviewed-on: https://go-review.googlesource.com/c/vscode-go/+/283255
Trust: Hyang-Ah Hana Kim <hyangah@gmail.com>
Reviewed-by: Suzy Mueller <suzmue@golang.org>
diff --git a/src/config.ts b/src/config.ts
index cffad71..677dae2 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -20,7 +20,7 @@
 	const isTrusted = getFromWorkspaceState(WORKSPACE_IS_TRUSTED_KEY, false);
 	defaultConfig = new Configuration(isTrusted, vscode.workspace.getConfiguration);
 	ctx.subscriptions.push(
-		vscode.commands.registerCommand('go.workspace.isTrusted.toggle', defaultConfig.toggleWorkspaceIsTrusted)
+		vscode.commands.registerCommand('go.workspace.isTrusted.toggle', toggleWorkspaceIsTrusted)
 	);
 
 	if (isTrusted) {
@@ -40,7 +40,7 @@
 		'More Info');
 	switch (val) {
 		case 'Trust This Workspace':
-			await defaultConfig.toggleWorkspaceIsTrusted();
+			await toggleWorkspaceIsTrusted();
 			break;
 		case 'More Info':
 			vscode.env.openExternal(
@@ -58,22 +58,27 @@
 	});
 }
 
+async function toggleWorkspaceIsTrusted() {
+	const v = defaultConfig.toggleWorkspaceIsTrusted();
+	await updateWorkspaceState(WORKSPACE_IS_TRUSTED_KEY, v);
+}
+
 // Go extension configuration for a workspace.
 export class Configuration {
 	constructor(
-		private workspaceIsTrusted: boolean,
-		private getConfiguration: typeof vscode.workspace.getConfiguration) { }
+		private workspaceIsTrusted = false,
+		private getConfiguration = vscode.workspace.getConfiguration) { }
 
-	public async toggleWorkspaceIsTrusted() {
+	public toggleWorkspaceIsTrusted() {
 		this.workspaceIsTrusted = !this.workspaceIsTrusted;
-		await updateWorkspaceState(WORKSPACE_IS_TRUSTED_KEY, this.workspaceIsTrusted);
+		return this.workspaceIsTrusted;
 	}
 
 	// returns a Proxied vscode.WorkspaceConfiguration, which prevents
 	// from using the workspace configuration if the workspace is untrusted.
-	public get<T>(uri?: vscode.Uri): vscode.WorkspaceConfiguration {
-		const cfg = this.getConfiguration('go', uri);
-		if (this.workspaceIsTrusted) {
+	public get<T>(section: string, uri?: vscode.Uri): vscode.WorkspaceConfiguration {
+		const cfg = this.getConfiguration(section, uri);
+		if (section !== 'go' || this.workspaceIsTrusted) {
 			return cfg;
 		}
 
@@ -117,3 +122,24 @@
 		return this._wrapped.update(section, value, configurationTarget, overrideInLanguage);
 	}
 }
+
+// getGoConfig is declared as an exported const rather than a function, so it can be stubbbed in testing.
+export const getGoConfig = (uri?: vscode.Uri) => {
+	return getConfig('go', uri);
+};
+
+// getGoplsConfig returns the user's gopls configuration.
+export function getGoplsConfig(uri?: vscode.Uri) {
+	return getConfig('gopls', uri);
+}
+
+function getConfig(section: string, uri?: vscode.Uri) {
+	if (!uri) {
+		if (vscode.window.activeTextEditor) {
+			uri = vscode.window.activeTextEditor.document.uri;
+		} else {
+			uri = null;
+		}
+	}
+	return defaultConfig ? defaultConfig.get(section, uri) : new Configuration().get(section, uri);
+}
diff --git a/src/goBuild.ts b/src/goBuild.ts
index 66ffb5e..2008ce3 100644
--- a/src/goBuild.ts
+++ b/src/goBuild.ts
@@ -5,6 +5,7 @@
 
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { buildDiagnosticCollection } from './goMain';
 import { isModSupported } from './goModules';
@@ -13,7 +14,6 @@
 import { getTestFlags } from './testUtils';
 import {
 	getCurrentGoPath,
-	getGoConfig,
 	getModuleCache,
 	getTempFilePath,
 	getWorkspaceFolderPath,
diff --git a/src/goCover.ts b/src/goCover.ts
index 2d525b3..d15cbf0 100644
--- a/src/goCover.ts
+++ b/src/goCover.ts
@@ -8,10 +8,10 @@
 import fs = require('fs');
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { isModSupported } from './goModules';
 import { getImportPathToFolder } from './goPackages';
 import { getTestFlags, goTest, showTestOutput, TestConfig } from './testUtils';
-import { getGoConfig } from './util';
 import { fixDriveCasingInWindows } from './utils/pathUtils';
 
 let gutterSvgs: { [key: string]: string; };
diff --git a/src/goDebugConfiguration.ts b/src/goDebugConfiguration.ts
index 7ac8851..61fd2f7 100644
--- a/src/goDebugConfiguration.ts
+++ b/src/goDebugConfiguration.ts
@@ -9,11 +9,12 @@
 import vscode = require('vscode');
 import parse = require('yargs-parser');
 import unparse = require('yargs-unparser');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { promptForMissingTool } from './goInstallTools';
 import { packagePathToGoModPathMap } from './goModules';
 import { getFromGlobalState, updateGlobalState } from './stateUtils';
-import { getBinPath, getGoConfig, resolvePath } from './util';
+import { getBinPath, resolvePath } from './util';
 import { parseEnvFiles } from './utils/envUtils';
 
 export class GoDebugConfigurationProvider implements vscode.DebugConfigurationProvider {
diff --git a/src/goDeclaration.ts b/src/goDeclaration.ts
index 034413c..4c9fd6d 100644
--- a/src/goDeclaration.ts
+++ b/src/goDeclaration.ts
@@ -8,6 +8,7 @@
 import cp = require('child_process');
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { promptForMissingTool, promptForUpdatingTool } from './goInstallTools';
 import { getModFolderPath, promptToUpdateToolForModules } from './goModules';
@@ -15,7 +16,6 @@
 	byteOffsetAt,
 	getBinPath,
 	getFileArchive,
-	getGoConfig,
 	getModuleCache,
 	getWorkspaceFolderPath,
 	goKeywords,
diff --git a/src/goEnv.ts b/src/goEnv.ts
index 754ff52..dddf3e0 100644
--- a/src/goEnv.ts
+++ b/src/goEnv.ts
@@ -7,7 +7,8 @@
 
 import path = require('path');
 import vscode = require('vscode');
-import { getCurrentGoPath, getGoConfig, getToolsGopath, resolvePath } from './util';
+import { getGoConfig } from './config';
+import { getCurrentGoPath, getToolsGopath, resolvePath } from './util';
 
 // toolInstallationEnvironment returns the environment in which tools should
 // be installed. It always returns a new object.
diff --git a/src/goEnvironmentStatus.ts b/src/goEnvironmentStatus.ts
index 1f6073b..8adc665 100644
--- a/src/goEnvironmentStatus.ts
+++ b/src/goEnvironmentStatus.ts
@@ -13,12 +13,13 @@
 import { promisify } from 'util';
 import vscode = require('vscode');
 import WebRequest = require('web-request');
+import { getGoConfig } from './config';
 import { toolInstallationEnvironment } from './goEnv';
 import { logVerbose } from './goLogging';
 import { addGoStatus, goEnvStatusbarItem, outputChannel, removeGoStatus } from './goStatus';
 import { getFromGlobalState, getFromWorkspaceState, updateGlobalState, updateWorkspaceState } from './stateUtils';
 import {
-	getBinPath, getCheckForToolsUpdatesConfig, getGoConfig, getGoVersion,
+	getBinPath, getCheckForToolsUpdatesConfig, getGoVersion,
 	getTempFilePath, GoVersion, rmdirRecursive } from './util';
 import {
 	correctBinname,
diff --git a/src/goExtraInfo.ts b/src/goExtraInfo.ts
index 694af96..24bd7a0 100644
--- a/src/goExtraInfo.ts
+++ b/src/goExtraInfo.ts
@@ -7,8 +7,8 @@
 
 import vscode = require('vscode');
 import { CancellationToken, Hover, HoverProvider, Position, TextDocument, WorkspaceConfiguration } from 'vscode';
+import { getGoConfig } from './config';
 import { definitionLocation } from './goDeclaration';
-import { getGoConfig } from './util';
 
 export class GoHoverProvider implements HoverProvider {
 	private goConfig: WorkspaceConfiguration | undefined;
diff --git a/src/goFormat.ts b/src/goFormat.ts
index 7810c04..34644a6 100644
--- a/src/goFormat.ts
+++ b/src/goFormat.ts
@@ -8,9 +8,10 @@
 import cp = require('child_process');
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { promptForMissingTool, promptForUpdatingTool } from './goInstallTools';
-import { getBinPath, getGoConfig } from './util';
+import { getBinPath } from './util';
 import { killProcessTree } from './utils/processUtils';
 
 export class GoDocumentFormattingEditProvider implements vscode.DocumentFormattingEditProvider {
diff --git a/src/goGenerateTests.ts b/src/goGenerateTests.ts
index a9e71c9..7f8ffe2 100644
--- a/src/goGenerateTests.ts
+++ b/src/goGenerateTests.ts
@@ -8,12 +8,13 @@
 import cp = require('child_process');
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 
 import { toolExecutionEnvironment } from './goEnv';
 import { promptForMissingTool } from './goInstallTools';
 import { GoDocumentSymbolProvider } from './goOutline';
 import { outputChannel } from './goStatus';
-import { getBinPath, getGoConfig } from './util';
+import { getBinPath } from './util';
 
 const generatedWord = 'Generated ';
 
diff --git a/src/goImplementations.ts b/src/goImplementations.ts
index 36f9e36..4ff1287 100644
--- a/src/goImplementations.ts
+++ b/src/goImplementations.ts
@@ -8,13 +8,13 @@
 import cp = require('child_process');
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { promptForMissingTool } from './goInstallTools';
 import {
 	byteOffsetAt,
 	canonicalizeGOPATHPrefix,
 	getBinPath,
-	getGoConfig,
 	getWorkspaceFolderPath
 } from './util';
 import { envPath, getCurrentGoRoot } from './utils/pathUtils';
diff --git a/src/goInstall.ts b/src/goInstall.ts
index 52b0223..874d831 100644
--- a/src/goInstall.ts
+++ b/src/goInstall.ts
@@ -6,10 +6,11 @@
 import cp = require('child_process');
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { isModSupported } from './goModules';
 import { outputChannel } from './goStatus';
-import { getBinPath, getCurrentGoPath, getGoConfig, getModuleCache } from './util';
+import { getBinPath, getCurrentGoPath, getModuleCache } from './util';
 import { envPath, getCurrentGoRoot, getCurrentGoWorkspaceFromGOPATH } from './utils/pathUtils';
 
 export async function installCurrentPackage(): Promise<void> {
diff --git a/src/goInstallTools.ts b/src/goInstallTools.ts
index d4fddd8..97fd0e2 100644
--- a/src/goInstallTools.ts
+++ b/src/goInstallTools.ts
@@ -11,6 +11,7 @@
 import { SemVer } from 'semver';
 import util = require('util');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment, toolInstallationEnvironment } from './goEnv';
 import { addGoRuntimeBaseToPATH, clearGoRuntimeBaseFromPATH } from './goEnvironmentStatus';
 import { getLanguageServerToolPath } from './goLanguageServer';
@@ -31,7 +32,6 @@
 import {
 	getBinPath,
 	getBinPathWithExplanation,
-	getGoConfig,
 	getGoVersion,
 	getTempFilePath,
 	getWorkspaceFolderPath,
diff --git a/src/goLanguageServer.ts b/src/goLanguageServer.ts
index b9ea67f..1282f20 100644
--- a/src/goLanguageServer.ts
+++ b/src/goLanguageServer.ts
@@ -33,6 +33,8 @@
 import {
 	LanguageClient
 } from 'vscode-languageclient/node';
+import WebRequest = require('web-request');
+import { getGoConfig, getGoplsConfig } from './config';
 import { extensionId } from './const';
 import { GoCodeActionProvider } from './goCodeAction';
 import { GoDefinitionProvider } from './goDeclaration';
@@ -58,16 +60,12 @@
 	getBinPath,
 	getCheckForToolsUpdatesConfig,
 	getCurrentGoPath,
-	getGoConfig,
-	getGoplsConfig,
 	getGoVersion,
 	getWorkspaceFolderPath,
 	removeDuplicateDiagnostics
 } from './util';
 import { getToolFromToolPath } from './utils/pathUtils';
 
-import WebRequest = require('web-request');
-
 export interface LanguageServerConfig {
 	serverName: string;
 	path: string;
diff --git a/src/goLint.ts b/src/goLint.ts
index 0e8abfb..1cd4346 100644
--- a/src/goLint.ts
+++ b/src/goLint.ts
@@ -5,11 +5,11 @@
 
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { lintDiagnosticCollection } from './goMain';
 import { diagnosticsStatusBarItem, outputChannel } from './goStatus';
 import {
-	getGoConfig,
 	getToolsGopath,
 	getWorkspaceFolderPath,
 	handleDiagnosticErrors,
diff --git a/src/goLiveErrors.ts b/src/goLiveErrors.ts
index fb592c5..7c4a723 100644
--- a/src/goLiveErrors.ts
+++ b/src/goLiveErrors.ts
@@ -8,11 +8,12 @@
 import cp = require('child_process');
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { promptForMissingTool } from './goInstallTools';
 import { buildDiagnosticCollection } from './goMain';
 import { isModSupported } from './goModules';
-import { getBinPath, getGoConfig } from './util';
+import { getBinPath } from './util';
 
 // Interface for settings configuration for adding and removing tags
 interface GoLiveErrorsConfig {
diff --git a/src/goMain.ts b/src/goMain.ts
index 21ad7d2..4c0d474 100644
--- a/src/goMain.ts
+++ b/src/goMain.ts
@@ -9,7 +9,7 @@
 import * as path from 'path';
 import semver = require('semver');
 import vscode = require('vscode');
-import { initConfig } from './config';
+import { getGoConfig, initConfig } from './config';
 import { extensionId } from './const';
 import { browsePackages } from './goBrowsePackage';
 import { buildCode } from './goBuild';
@@ -63,7 +63,6 @@
 	getBinPath,
 	getCurrentGoPath,
 	getExtensionCommands,
-	getGoConfig,
 	getGoEnv,
 	getGoVersion,
 	getToolsGopath,
diff --git a/src/goModifytags.ts b/src/goModifytags.ts
index 2d2e87c..8070597 100644
--- a/src/goModifytags.ts
+++ b/src/goModifytags.ts
@@ -7,9 +7,10 @@
 
 import cp = require('child_process');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { promptForMissingTool, promptForUpdatingTool } from './goInstallTools';
-import { byteOffsetAt, getBinPath, getFileArchive, getGoConfig } from './util';
+import { byteOffsetAt, getBinPath, getFileArchive } from './util';
 
 // Interface for the output from gomodifytags
 interface GomodifytagsOutput {
diff --git a/src/goModules.ts b/src/goModules.ts
index 87f50f5..902e7af 100644
--- a/src/goModules.ts
+++ b/src/goModules.ts
@@ -6,11 +6,12 @@
 import cp = require('child_process');
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { installTools } from './goInstallTools';
 import { getTool } from './goTools';
 import { getFromGlobalState, updateGlobalState } from './stateUtils';
-import { getBinPath, getGoConfig, getGoVersion, getModuleCache } from './util';
+import { getBinPath, getGoVersion, getModuleCache } from './util';
 import { envPath, fixDriveCasingInWindows, getCurrentGoRoot } from './utils/pathUtils';
 
 export let GO111MODULE: string;
diff --git a/src/goOutline.ts b/src/goOutline.ts
index 9e52f6d..c0f782b 100644
--- a/src/goOutline.ts
+++ b/src/goOutline.ts
@@ -7,12 +7,12 @@
 
 import cp = require('child_process');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { promptForMissingTool, promptForUpdatingTool } from './goInstallTools';
 import {
 	getBinPath,
 	getFileArchive,
-	getGoConfig,
 	makeMemoizedByteOffsetConverter
 } from './util';
 import {killProcess} from './utils/processUtils';
diff --git a/src/goPlayground.ts b/src/goPlayground.ts
index 6d09c02..ec7570c 100644
--- a/src/goPlayground.ts
+++ b/src/goPlayground.ts
@@ -6,9 +6,10 @@
 import { execFile } from 'child_process';
 import * as path from 'path';
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { promptForMissingTool } from './goInstallTools';
 import { outputChannel } from './goStatus';
-import { getBinPath, getGoConfig } from './util';
+import { getBinPath } from './util';
 
 const TOOL_CMD_NAME = 'goplay';
 
diff --git a/src/goReferences.ts b/src/goReferences.ts
index 1aba8d9..53771fd 100644
--- a/src/goReferences.ts
+++ b/src/goReferences.ts
@@ -8,6 +8,7 @@
 import cp = require('child_process');
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { promptForMissingTool } from './goInstallTools';
 import {
@@ -15,7 +16,6 @@
 	canonicalizeGOPATHPrefix,
 	getBinPath,
 	getFileArchive,
-	getGoConfig
 } from './util';
 import {killProcessTree} from './utils/processUtils';
 
diff --git a/src/goReferencesCodelens.ts b/src/goReferencesCodelens.ts
index 2746191..1e23213 100644
--- a/src/goReferencesCodelens.ts
+++ b/src/goReferencesCodelens.ts
@@ -8,10 +8,11 @@
 import { isAbsolute } from 'path';
 import vscode = require('vscode');
 import { CancellationToken, CodeLens, Range, TextDocument } from 'vscode';
+import { getGoConfig } from './config';
 import { GoBaseCodeLensProvider } from './goBaseCodelens';
 import { GoDocumentSymbolProvider } from './goOutline';
 import { GoReferenceProvider } from './goReferences';
-import { getBinPath, getGoConfig } from './util';
+import { getBinPath } from './util';
 
 const methodRegex = /^func\s+\(\s*\w+\s+\*?\w+\s*\)\s+/;
 
diff --git a/src/goRename.ts b/src/goRename.ts
index ff71aa3..6dff038 100644
--- a/src/goRename.ts
+++ b/src/goRename.ts
@@ -7,11 +7,12 @@
 
 import cp = require('child_process');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { Edit, FilePatch, getEditsFromUnifiedDiffStr, isDiffToolAvailable } from './diffUtils';
 import { toolExecutionEnvironment } from './goEnv';
 import { promptForMissingTool } from './goInstallTools';
 import { outputChannel } from './goStatus';
-import { byteOffsetAt, canonicalizeGOPATHPrefix, getBinPath, getGoConfig } from './util';
+import { byteOffsetAt, canonicalizeGOPATHPrefix, getBinPath } from './util';
 import {killProcessTree} from './utils/processUtils';
 
 export class GoRenameProvider implements vscode.RenameProvider {
diff --git a/src/goRunTestCodelens.ts b/src/goRunTestCodelens.ts
index 587450a..9474f6d 100644
--- a/src/goRunTestCodelens.ts
+++ b/src/goRunTestCodelens.ts
@@ -7,10 +7,10 @@
 
 import vscode = require('vscode');
 import { CancellationToken, CodeLens, Command, TextDocument } from 'vscode';
+import { getGoConfig } from './config';
 import { GoBaseCodeLensProvider } from './goBaseCodelens';
 import { GoDocumentSymbolProvider } from './goOutline';
 import { getBenchmarkFunctions, getTestFunctions } from './testUtils';
-import { getGoConfig } from './util';
 
 export class GoRunTestCodeLensProvider extends GoBaseCodeLensProvider {
 	private readonly benchmarkRegex = /^Benchmark.+/;
diff --git a/src/goSignature.ts b/src/goSignature.ts
index c8d7e42..d3bb93f 100755
--- a/src/goSignature.ts
+++ b/src/goSignature.ts
@@ -15,8 +15,9 @@
 	TextDocument,
 	WorkspaceConfiguration
 } from 'vscode';
+import { getGoConfig } from './config';
 import { definitionLocation } from './goDeclaration';
-import { getGoConfig, getParametersAndReturnType, isPositionInComment, isPositionInString } from './util';
+import { getParametersAndReturnType, isPositionInComment, isPositionInString } from './util';
 
 export class GoSignatureHelpProvider implements SignatureHelpProvider {
 	constructor(private goConfig?: WorkspaceConfiguration) {}
diff --git a/src/goStatus.ts b/src/goStatus.ts
index 2d0585e..3f31d04 100644
--- a/src/goStatus.ts
+++ b/src/goStatus.ts
@@ -8,11 +8,12 @@
 
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { formatGoVersion, GoEnvironmentOption, terminalCreationListener } from './goEnvironmentStatus';
 import { buildLanguageServerConfig, getLocalGoplsVersion, languageServerIsRunning, serverOutputChannel } from './goLanguageServer';
 import { isGoFile } from './goMode';
 import { getModFolderPath, isModSupported } from './goModules';
-import { getGoConfig, getGoVersion } from './util';
+import { getGoVersion } from './util';
 
 export let outputChannel = vscode.window.createOutputChannel('Go');
 
diff --git a/src/goSuggest.ts b/src/goSuggest.ts
index 20ea2cb..284060f 100644
--- a/src/goSuggest.ts
+++ b/src/goSuggest.ts
@@ -8,6 +8,7 @@
 import cp = require('child_process');
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { getTextEditForAddImport } from './goImport';
 import { promptForMissingTool, promptForUpdatingTool } from './goInstallTools';
@@ -17,7 +18,6 @@
 	byteOffsetAt,
 	getBinPath,
 	getCurrentGoPath,
-	getGoConfig,
 	getParametersAndReturnType,
 	goBuiltinTypes,
 	goKeywords,
diff --git a/src/goSymbol.ts b/src/goSymbol.ts
index 4e4948d..91a378b 100644
--- a/src/goSymbol.ts
+++ b/src/goSymbol.ts
@@ -7,9 +7,10 @@
 
 import cp = require('child_process');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { promptForMissingTool, promptForUpdatingTool } from './goInstallTools';
-import { getBinPath, getGoConfig, getWorkspaceFolderPath} from './util';
+import { getBinPath, getWorkspaceFolderPath} from './util';
 import { getCurrentGoRoot } from './utils/pathUtils';
 import {killProcessTree} from './utils/processUtils';
 
diff --git a/src/goTools.ts b/src/goTools.ts
index e9387ba..a4e4d97 100644
--- a/src/goTools.ts
+++ b/src/goTools.ts
@@ -12,7 +12,7 @@
 import semver = require('semver');
 import util = require('util');
 import { goLiveErrorsEnabled } from './goLiveErrors';
-import { getBinPath, getGoConfig, GoVersion } from './util';
+import { getBinPath, GoVersion } from './util';
 
 export interface Tool {
 	name: string;
diff --git a/src/goTypeDefinition.ts b/src/goTypeDefinition.ts
index 0487d70..0568669 100644
--- a/src/goTypeDefinition.ts
+++ b/src/goTypeDefinition.ts
@@ -8,6 +8,7 @@
 import cp = require('child_process');
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { adjustWordPosition, definitionLocation, parseMissingError } from './goDeclaration';
 import { toolExecutionEnvironment } from './goEnv';
 import { promptForMissingTool } from './goInstallTools';
@@ -16,7 +17,6 @@
 	canonicalizeGOPATHPrefix,
 	getBinPath,
 	getFileArchive,
-	getGoConfig,
 	goBuiltinTypes
 } from './util';
 import {killProcessTree} from './utils/processUtils';
diff --git a/src/goVet.ts b/src/goVet.ts
index 210213a..dbfb3ea 100644
--- a/src/goVet.ts
+++ b/src/goVet.ts
@@ -5,11 +5,11 @@
 
 import path = require('path');
 import vscode = require('vscode');
+import { getGoConfig } from './config';
 import { toolExecutionEnvironment } from './goEnv';
 import { vetDiagnosticCollection } from './goMain';
 import { diagnosticsStatusBarItem, outputChannel } from './goStatus';
 import {
-	getGoConfig,
 	getGoVersion,
 	getWorkspaceFolderPath,
 	handleDiagnosticErrors,
diff --git a/src/util.ts b/src/util.ts
index 896914b..4ac4f69 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -11,6 +11,7 @@
 import util = require('util');
 import vscode = require('vscode');
 import { NearestNeighborDict, Node } from './avlTree';
+import { getGoConfig } from './config';
 import { extensionId } from './const';
 import { toolExecutionEnvironment } from './goEnv';
 import { languageClient } from './goLanguageServer';
@@ -157,16 +158,6 @@
 let vendorSupport: boolean | undefined;
 let toolsGopath: string;
 
-// getGoConfig is declared as an exported const rather than a function, so it can be stubbbed in testing.
-export const getGoConfig = (uri?: vscode.Uri) => {
-	return getConfig('go', uri);
-};
-
-// getGoplsConfig returns the user's gopls configuration.
-export function getGoplsConfig(uri?: vscode.Uri) {
-	return getConfig('gopls', uri);
-}
-
 // getCheckForToolsUpdatesConfig returns go.toolsManagement.checkForUpdates configuration.
 export function getCheckForToolsUpdatesConfig(gocfg: vscode.WorkspaceConfiguration) {
 	// useGoProxyToCheckForToolUpdates deprecation
@@ -183,17 +174,6 @@
 	return gocfg.get('toolsManagement.checkForUpdates') as string;
 }
 
-function getConfig(section: string, uri?: vscode.Uri) {
-	if (!uri) {
-		if (vscode.window.activeTextEditor) {
-			uri = vscode.window.activeTextEditor.document.uri;
-		} else {
-			uri = null;
-		}
-	}
-	return vscode.workspace.getConfiguration(section, uri);
-}
-
 export function byteOffsetAt(document: vscode.TextDocument, position: vscode.Position): number {
 	const offset = document.offsetAt(position);
 	const text = document.getText();
diff --git a/test/gopls/extension.test.ts b/test/gopls/extension.test.ts
index 5d4d93c..05d3523 100644
--- a/test/gopls/extension.test.ts
+++ b/test/gopls/extension.test.ts
@@ -3,14 +3,13 @@
  * Licensed under the MIT License. See LICENSE in the project root for license information.
  *--------------------------------------------------------*/
 import * as assert from 'assert';
-import cp = require('child_process');
 import { EventEmitter } from 'events';
 import * as path from 'path';
 import sinon = require('sinon');
 import * as vscode from 'vscode';
 import { LanguageClient } from 'vscode-languageclient/node';
+import { getGoConfig } from '../../src/config';
 import { buildLanguageClient, BuildLanguageClientOption, buildLanguageServerConfig } from '../../src/goLanguageServer';
-import { getGoConfig } from '../../src/util';
 
 // FakeOutputChannel is a fake output channel used to buffer
 // the output of the tested language client in an in-memory
diff --git a/test/gopls/update.test.ts b/test/gopls/update.test.ts
index 4a3e101..ecefa75 100644
--- a/test/gopls/update.test.ts
+++ b/test/gopls/update.test.ts
@@ -9,9 +9,10 @@
 import semver = require('semver');
 import sinon = require('sinon');
 import * as vscode from 'vscode';
+import { getGoConfig } from '../../src/config';
 import * as lsp from '../../src/goLanguageServer';
 import { getTool, Tool } from '../../src/goTools';
-import { getCheckForToolsUpdatesConfig as getCheckForToolUpdatesConfig, getGoConfig } from '../../src/util';
+import { getCheckForToolsUpdatesConfig as getCheckForToolUpdatesConfig } from '../../src/util';
 
 suite('getCheckForToolUpdatesConfig tests', () => {
 	const CHECK_FOR_UPDATES = 'toolsManagement.checkForUpdates';
diff --git a/test/integration/config.test.ts b/test/integration/config.test.ts
index 4569d9f..500cc58 100644
--- a/test/integration/config.test.ts
+++ b/test/integration/config.test.ts
@@ -12,15 +12,15 @@
 suite('GoConfiguration Tests', () => {
 	function check(trusted: boolean, workspaceConfig: { [key: string]: any }, key: string, expected: any) {
 		const getConfigurationFn = (section: string) => new MockCfg(workspaceConfig);
-		const cfg = (new Configuration(trusted, getConfigurationFn)).get();
+		const cfg = (new Configuration(trusted, getConfigurationFn)).get('go');
 
 		const got0 = JSON.stringify(cfg.get(key));
 		const got1 = JSON.stringify(cfg[key]);
 		const want = JSON.stringify(expected);
 		assert.strictEqual(got0, want, `cfg.get(${key}) = ${got0}, want ${want}`);
 		assert.strictEqual(got1, want, `cfg[${key}] = ${got1}, want ${want}`);
-
 	}
+
 	test('trusted workspace', () => {
 		check(true, { goroot: 'goroot_val' }, 'goroot', 'goroot_val');
 		check(true, { gopath: 'gopath_val' }, 'gopath', 'gopath_val');
@@ -40,6 +40,27 @@
 		check(false, { buildFlags: ['-v'] }, 'buildFlags', ['-v']);
 		check(false, { languageServerFlags: ['-rpc.trace'] }, 'languageServerFlags', ['-rpc.trace']);
 	});
+
+	function checkGopls(trusted: boolean, workspaceConfig: { [key: string]: any }, key: string, expected: any) {
+		const getConfigurationFn = (section: string) => new MockCfg(workspaceConfig);
+		const cfg = (new Configuration(trusted, getConfigurationFn)).get('gopls');
+
+		const got0 = JSON.stringify(cfg.get(key));
+		const got1 = JSON.stringify(cfg[key]);
+		const want = JSON.stringify(expected);
+		assert.strictEqual(got0, want, `cfg.get(${key}) = ${got0}, want ${want}`);
+		assert.strictEqual(got1, want, `cfg[${key}] = ${got1}, want ${want}`);
+	}
+
+	test('trusted workspace (gopls settings)', () => {
+		checkGopls(true, { buildFlags: '-v' }, 'buildFlags', '-v');
+		checkGopls(true, { env: { GOBIN: 'foo' } }, 'env', { GOBIN: 'foo' });
+	});
+
+	test('untrusted workspace (gopls settings)', () => {
+		checkGopls(false, { buildFlags: '-v' }, 'buildFlags', '-v');
+		checkGopls(false, { env: { GOBIN: 'foo' } }, 'env', { GOBIN: 'foo' });
+	});
 });
 
 // tslint:disable: no-any
diff --git a/test/integration/extension.test.ts b/test/integration/extension.test.ts
index 3957b2e..5b75118 100644
--- a/test/integration/extension.test.ts
+++ b/test/integration/extension.test.ts
@@ -9,6 +9,7 @@
 import * as path from 'path';
 import * as sinon from 'sinon';
 import * as vscode from 'vscode';
+import { getGoConfig } from '../../src/config';
 import { FilePatch, getEdits, getEditsFromUnifiedDiffStr } from '../../src/diffUtils';
 import { check } from '../../src/goCheck';
 import { GoDefinitionProvider } from '../../src/goDeclaration';
@@ -33,7 +34,6 @@
 import {
 	getBinPath,
 	getCurrentGoPath,
-	getGoConfig,
 	getImportPath,
 	getToolsGopath,
 	handleDiagnosticErrors,
diff --git a/test/integration/goDebugConfiguration.test.ts b/test/integration/goDebugConfiguration.test.ts
index d65cc82..03662ab 100644
--- a/test/integration/goDebugConfiguration.test.ts
+++ b/test/integration/goDebugConfiguration.test.ts
@@ -5,10 +5,11 @@
 import sinon = require('sinon');
 import vscode = require('vscode');
 import parse = require('yargs-parser');
+import { getGoConfig } from '../../src/config';
 import { GoDebugConfigurationProvider } from '../../src/goDebugConfiguration';
 import goEnv = require('../../src/goEnv');
 import { updateGoVarsFromConfig } from '../../src/goInstallTools';
-import { getGoConfig, rmdirRecursive } from '../../src/util';
+import { rmdirRecursive } from '../../src/util';
 
 suite('Debug Environment Variable Merge Test', () => {
 	const debugConfigProvider = new GoDebugConfigurationProvider();
@@ -138,7 +139,7 @@
 
 suite('Debug Configuration Merge User Settings', () => {
 	const debugConfigProvider = new GoDebugConfigurationProvider();
-	const utils = require('../../src/util');
+	const config = require('../../src/config');
 
 	teardown(() => sinon.restore());
 
@@ -166,7 +167,7 @@
 			}) as vscode.WorkspaceConfiguration;
 
 			// Adjust the workspace config.
-			sinon.stub(utils, 'getGoConfig').returns(goConfig);
+			sinon.stub(config, 'getGoConfig').returns(goConfig);
 
 			const cfg2 = {
 				name: 'Launch',
@@ -208,7 +209,7 @@
 					}
 				}
 			}) as vscode.WorkspaceConfiguration;
-			sinon.stub(utils, 'getGoConfig').returns(goConfig);
+			sinon.stub(config, 'getGoConfig').returns(goConfig);
 
 			const cfg = {
 				name: 'Launch',
@@ -249,7 +250,7 @@
 					}
 				}
 			}) as vscode.WorkspaceConfiguration;
-			sinon.stub(utils, 'getGoConfig').returns(goConfig);
+			sinon.stub(config, 'getGoConfig').returns(goConfig);
 
 			const cfg = {
 				name: 'Launch',
diff --git a/test/integration/test.test.ts b/test/integration/test.test.ts
index 902c923..670a8bc 100644
--- a/test/integration/test.test.ts
+++ b/test/integration/test.test.ts
@@ -11,8 +11,9 @@
 import path = require('path');
 import sinon = require('sinon');
 import vscode = require('vscode');
+import { getGoConfig } from '../../src/config';
 import { computeTestCommand, getTestFlags, goTest } from '../../src/testUtils';
-import { getGoConfig, rmdirRecursive } from '../../src/util';
+import { rmdirRecursive } from '../../src/util';
 
 suite('Test Go Test Args', () => {
 	function runTest(param: {