diff --git a/packages/core/src/dev/activation.ts b/packages/core/src/dev/activation.ts index 16b5d7e53ad..a712e984dfb 100644 --- a/packages/core/src/dev/activation.ts +++ b/packages/core/src/dev/activation.ts @@ -25,6 +25,7 @@ import { NotificationsController } from '../notifications/controller' import { DevNotificationsState } from '../notifications/types' import { QuickPickItem } from 'vscode' import { ChildProcess } from '../shared/utilities/processUtils' +import { WorkspaceLSPResolver } from '../amazonq/lsp/workspaceInstaller' interface MenuOption { readonly label: string @@ -450,6 +451,12 @@ const resettableFeatures: readonly ResettableFeature[] = [ detail: 'Resets memory/global state for the notifications panel (includes dismissed, onReceive).', executor: resetNotificationsState, }, + { + name: 'workspace lsp', + label: 'Lsp', + detail: 'Resets workspace LSP', + executor: resetWorkspaceLspDownload, + }, ] as const // TODO this is *somewhat* similar to `openStorageFromInput`. If we need another @@ -538,6 +545,10 @@ async function resetNotificationsState() { await targetNotificationsController.reset() } +async function resetWorkspaceLspDownload() { + await new WorkspaceLSPResolver().resolve() +} + async function editNotifications() { const storageKey = 'aws.notifications.dev' const current = globalState.get(storageKey) ?? {} diff --git a/packages/core/src/shared/lsp/lspResolver.ts b/packages/core/src/shared/lsp/lspResolver.ts index 80953fa52bf..d85ee73b929 100644 --- a/packages/core/src/shared/lsp/lspResolver.ts +++ b/packages/core/src/shared/lsp/lspResolver.ts @@ -14,6 +14,8 @@ import { getApplicationSupportFolder } from '../vscode/env' import { createHash } from '../crypto' import { lspSetupStage, StageResolver, tryStageResolvers } from './utils/setupStage' import { HttpResourceFetcher } from '../resourcefetcher/httpResourceFetcher' +import { showMessageWithCancel } from '../../shared/utilities/messages' +import { Timeout } from '../utilities/timeoutUtils' export class LanguageServerResolver { constructor( @@ -31,32 +33,38 @@ export class LanguageServerResolver { * @throws ToolkitError if no compatible version can be found */ async resolve() { - const latestVersion = this.latestCompatibleLspVersion() - const targetContents = this.getLSPTargetContents(latestVersion) - const cacheDirectory = this.getDownloadDirectory(latestVersion.serverVersion) - - const serverResolvers: StageResolver[] = [ - { - resolve: async () => await this.getLocalServer(cacheDirectory, latestVersion, targetContents), - telemetryMetadata: { id: this.lsName, languageServerLocation: 'cache' }, - }, - { - resolve: async () => await this.fetchRemoteServer(cacheDirectory, latestVersion, targetContents), - telemetryMetadata: { id: this.lsName, languageServerLocation: 'remote' }, - }, - { - resolve: async () => await this.getFallbackServer(latestVersion), - telemetryMetadata: { id: this.lsName, languageServerLocation: 'fallback' }, - }, - ] - - return await tryStageResolvers('getServer', serverResolvers, getServerVersion) - + const timeout = new Timeout(5000) + await showMessageWithCancel(`Downloading '${this.lsName}' language server`, timeout) function getServerVersion(result: LspResult) { return { languageServerVersion: result.version, } } + try { + const latestVersion = this.latestCompatibleLspVersion() + const targetContents = this.getLSPTargetContents(latestVersion) + const cacheDirectory = this.getDownloadDirectory(latestVersion.serverVersion) + + const serverResolvers: StageResolver[] = [ + { + resolve: async () => await this.getLocalServer(cacheDirectory, latestVersion, targetContents), + telemetryMetadata: { id: this.lsName, languageServerLocation: 'cache' }, + }, + { + resolve: async () => await this.fetchRemoteServer(cacheDirectory, latestVersion, targetContents), + telemetryMetadata: { id: this.lsName, languageServerLocation: 'remote' }, + }, + { + resolve: async () => await this.getFallbackServer(latestVersion), + telemetryMetadata: { id: this.lsName, languageServerLocation: 'fallback' }, + }, + ] + + return await tryStageResolvers('getServer', serverResolvers, getServerVersion) + } finally { + logger.info(`Finished setting up LSP server`) + timeout.cancel() + } } private async getFallbackServer(latestVersion: LspVersion): Promise {