in src/goEnvironmentStatus.ts [134:205]
export async function setSelectedGo(goOption: vscode.QuickPickItem, promptReload = true): Promise<boolean> {
if (!goOption) {
return false;
}
// if the selected go version is not installed, install it
if (goOption instanceof GoEnvironmentOption) {
const o = goOption.available ? (goOption as GoEnvironmentOption) : await downloadGo(goOption);
// check that the given binary is not already at the beginning of the PATH
const go = await getGoVersion();
if (!!go && (go.binaryPath === o.binpath || 'Go ' + go.format() === o.label)) {
return false;
}
await updateWorkspaceState('selectedGo', o);
} else if (goOption.label === CLEAR_SELECTION) {
if (!getSelectedGo()) {
return false; // do nothing.
}
await updateWorkspaceState('selectedGo', undefined);
} else if (goOption.label === CHOOSE_FROM_FILE_BROWSER) {
const currentGOROOT = getCurrentGoRoot();
const defaultUri = currentGOROOT ? vscode.Uri.file(path.join(currentGOROOT, 'bin')) : undefined;
const newGoUris = await vscode.window.showOpenDialog({
canSelectFiles: true,
canSelectFolders: false,
canSelectMany: false,
defaultUri
});
if (!newGoUris || newGoUris.length !== 1) {
return false;
}
const newGoBin = fixDriveCasingInWindows(newGoUris[0].fsPath);
const oldGoBin = fixDriveCasingInWindows(path.join(defaultUri?.fsPath ?? '', correctBinname('go')));
if (newGoBin === oldGoBin) {
return false;
}
if (!executableFileExists(newGoBin)) {
vscode.window.showErrorMessage(`${newGoBin} is not an executable`);
return false;
}
let newGo: GoVersion | undefined;
try {
newGo = await getGoVersion(newGoBin);
await updateWorkspaceState('selectedGo', new GoEnvironmentOption(newGo.binaryPath, formatGoVersion(newGo)));
} catch (e) {
if (!newGo || !newGo.isValid()) {
vscode.window.showErrorMessage(`failed to get "${newGoBin} version", invalid Go binary:\n${e}`);
return false;
}
}
}
// prompt the user to reload the window.
// promptReload defaults to true and should only be false for tests.
if (promptReload) {
const choice = await vscode.window.showWarningMessage(
'Please reload the window to finish applying Go version changes.',
{
modal: true
},
'Reload Window'
);
if (choice === 'Reload Window') {
await vscode.commands.executeCommand('workbench.action.reloadWindow');
}
}
goEnvStatusbarItem.text = 'Go: reload required';
goEnvStatusbarItem.command = 'workbench.action.reloadWindow';
return true;
}