in src/goInstallTools.ts [382:451]
export async function promptForMissingTool(toolName: string) {
const tool = getTool(toolName);
if (!tool) {
vscode.window.showWarningMessage(
`${toolName} is not found. Please make sure it is installed and available in the PATH ${getEnvPath()}`
);
return;
}
// If user has declined to install this tool, don't prompt for it.
if (declinedToolInstall(toolName)) {
return;
}
const goVersion = await getGoVersion();
if (!goVersion) {
return;
}
// Show error messages for outdated tools or outdated Go versions.
if (tool.minimumGoVersion && goVersion.lt(tool.minimumGoVersion.format())) {
vscode.window.showInformationMessage(
`You are using go${goVersion.format()}, but ${
tool.name
} requires at least go${tool.minimumGoVersion.format()}.`
);
return;
}
if (tool.maximumGoVersion && goVersion.gt(tool.maximumGoVersion.format())) {
vscode.window.showInformationMessage(
`You are using go${goVersion.format()}, but ${
tool.name
} only supports go${tool.maximumGoVersion.format()} and below.`
);
return;
}
const installOptions = ['Install'];
let missing = await getMissingTools(goVersion);
if (!containsTool(missing, tool)) {
// If this function has been called, we want to display the prompt whether
// it appears in missing or not.
missing.push(tool);
}
missing = missing.filter((x) => x === tool || tool.isImportant);
if (missing.length > 1) {
// Offer the option to install all tools.
installOptions.push('Install All');
}
const cmd = goVersion.lt('1.16')
? `go get -v ${getImportPath(tool, goVersion)}`
: `go install -v ${getImportPathWithVersion(tool, undefined, goVersion)}`;
const selected = await vscode.window.showErrorMessage(
`The "${tool.name}" command is not available. Run "${cmd}" to install.`,
...installOptions
);
switch (selected) {
case 'Install':
await installTools([tool], goVersion);
break;
case 'Install All':
await installTools(missing, goVersion);
removeGoStatus(STATUS_BAR_ITEM_NAME);
break;
default:
// The user has declined to install this tool.
declinedInstalls.push(tool);
break;
}
}