From 68b3551d1e0eb49c5d0f5fe2e978cb790f181b9c Mon Sep 17 00:00:00 2001 From: Josh Pinkney Date: Tue, 11 Mar 2025 21:36:16 -0400 Subject: [PATCH 1/2] test(amazonq): add language server activation tests --- packages/amazonq/src/lsp/lspInstaller.ts | 5 +- .../amazonq/test/e2e/lsp/amazonqLsp.test.ts | 31 ++ .../amazonq/test/e2e/lsp/lspInstaller.test.ts | 282 ----------------- .../amazonq/test/e2e/lsp/lspInstallerUtil.ts | 287 ++++++++++++++++++ .../test/e2e/lsp/workspaceContextLsp.test.ts | 42 +++ packages/core/src/amazonq/index.ts | 1 + .../core/src/amazonq/lsp/lspController.ts | 7 +- .../src/amazonq/lsp/workspaceInstaller.ts | 8 +- packages/core/src/dev/activation.ts | 4 +- 9 files changed, 373 insertions(+), 294 deletions(-) create mode 100644 packages/amazonq/test/e2e/lsp/amazonqLsp.test.ts delete mode 100644 packages/amazonq/test/e2e/lsp/lspInstaller.test.ts create mode 100644 packages/amazonq/test/e2e/lsp/lspInstallerUtil.ts create mode 100644 packages/amazonq/test/e2e/lsp/workspaceContextLsp.test.ts diff --git a/packages/amazonq/src/lsp/lspInstaller.ts b/packages/amazonq/src/lsp/lspInstaller.ts index e041682ee74..ae7fe39cca5 100644 --- a/packages/amazonq/src/lsp/lspInstaller.ts +++ b/packages/amazonq/src/lsp/lspInstaller.ts @@ -6,10 +6,11 @@ import { fs, getNodeExecutableName, BaseLspInstaller, ResourcePaths } from 'aws-core-vscode/shared' import path from 'path' import { getAmazonQLspConfig } from './config' +import { LspConfig } from 'aws-core-vscode/amazonq' export class AmazonQLspInstaller extends BaseLspInstaller.BaseLspInstaller { - constructor() { - super(getAmazonQLspConfig(), 'amazonqLsp') + constructor(lspConfig: LspConfig = getAmazonQLspConfig()) { + super(lspConfig, 'amazonqLsp') } protected override async postInstall(assetDirectory: string): Promise { diff --git a/packages/amazonq/test/e2e/lsp/amazonqLsp.test.ts b/packages/amazonq/test/e2e/lsp/amazonqLsp.test.ts new file mode 100644 index 00000000000..53ed1edd7b4 --- /dev/null +++ b/packages/amazonq/test/e2e/lsp/amazonqLsp.test.ts @@ -0,0 +1,31 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { AmazonQLspInstaller } from '../../../src/lsp/lspInstaller' +import { getAmazonQLspConfig } from '../../../src/lsp/config' +import { createLspInstallerTests } from './lspInstallerUtil' +import { LspConfig } from 'aws-core-vscode/amazonq' + +describe('AmazonQLSP', () => { + createLspInstallerTests({ + suiteName: 'AmazonQLSPInstaller', + lspConfig: getAmazonQLspConfig(), + createInstaller: (lspConfig?: LspConfig) => new AmazonQLspInstaller(lspConfig), + targetContents: [ + { + bytes: 0, + filename: 'servers.zip', + hashes: [], + url: 'http://fakeurl', + }, + ], + setEnv: (path: string) => { + process.env.__AMAZONQLSP_PATH = path + }, + resetEnv: () => { + delete process.env.__AMAZONQLSP_PATH + }, + }) +}) diff --git a/packages/amazonq/test/e2e/lsp/lspInstaller.test.ts b/packages/amazonq/test/e2e/lsp/lspInstaller.test.ts deleted file mode 100644 index 04752640050..00000000000 --- a/packages/amazonq/test/e2e/lsp/lspInstaller.test.ts +++ /dev/null @@ -1,282 +0,0 @@ -/*! - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -import assert from 'assert' -import sinon from 'sinon' -import { AmazonQLspInstaller } from '../../../src/lsp/lspInstaller' -import { - DevSettings, - fs, - globals, - LanguageServerResolver, - makeTemporaryToolkitFolder, - ManifestResolver, - manifestStorageKey, - request, -} from 'aws-core-vscode/shared' -import * as semver from 'semver' -import { assertTelemetry } from 'aws-core-vscode/test' -import { LspConfig, LspController } from 'aws-core-vscode/amazonq' -import { LanguageServerSetup } from 'aws-core-vscode/telemetry' -import { getAmazonQLspConfig } from '../../../src/lsp/config' - -function createVersion(version: string) { - return { - isDelisted: false, - serverVersion: version, - targets: [ - { - arch: process.arch, - platform: process.platform, - contents: [ - { - bytes: 0, - filename: 'servers.zip', - hashes: [], - url: 'http://fakeurl', - }, - ], - }, - ], - } -} - -describe('AmazonQLSPInstaller', () => { - let resolver: AmazonQLspInstaller - let sandbox: sinon.SinonSandbox - let tempDir: string - // If globalState contains an ETag that is up to date with remote, we won't fetch it resulting in inconsistent behavior. - // Therefore, we clear it temporarily for these tests to ensure consistent behavior. - let manifestStorage: { [key: string]: any } - let lspConfig: LspConfig - - before(async () => { - manifestStorage = globals.globalState.get(manifestStorageKey) || {} - lspConfig = getAmazonQLspConfig() - }) - - beforeEach(async () => { - sandbox = sinon.createSandbox() - resolver = new AmazonQLspInstaller() - tempDir = await makeTemporaryToolkitFolder() - sandbox.stub(LanguageServerResolver.prototype, 'defaultDownloadFolder').returns(tempDir) - // Called on extension activation and can contaminate telemetry. - sandbox.stub(LspController.prototype, 'trySetupLsp') - await globals.globalState.update(manifestStorageKey, {}) - }) - - afterEach(async () => { - delete process.env.__AMAZONQLSP_LOCATION_OVERRIDE - sandbox.restore() - await fs.delete(tempDir, { - recursive: true, - }) - }) - - after(async () => { - await globals.globalState.update(manifestStorageKey, manifestStorage) - }) - - describe('resolve()', () => { - it('uses dev setting override', async () => { - const locationOverride = '/custom/path/to/lsp' - const serviceConfigStub = sandbox.stub().returns({ - locationOverride, - }) - sandbox.stub(DevSettings, 'instance').get(() => ({ - getServiceConfig: serviceConfigStub, - })) - - const result = await resolver.resolve() - - assert.strictEqual(result.assetDirectory, locationOverride) - assert.strictEqual(result.location, 'override') - assert.strictEqual(result.version, '0.0.0') - }) - - it('uses environment variable override', async () => { - const overridePath = '/custom/path/to/lsp' - process.env.__AMAZONQLSP_LOCATION_OVERRIDE = overridePath - - const result = await resolver.resolve() - - assert.strictEqual(result.assetDirectory, overridePath) - assert.strictEqual(result.location, 'override') - assert.strictEqual(result.version, '0.0.0') - }) - - it('resolves', async () => { - // First try - should download the file - const download = await resolver.resolve() - - assert.ok(download.assetDirectory.startsWith(tempDir)) - assert.deepStrictEqual(download.location, 'remote') - assert.ok(semver.satisfies(download.version, lspConfig.supportedVersions)) - - // Second try - Should see the contents in the cache - const cache = await resolver.resolve() - - assert.ok(cache.assetDirectory.startsWith(tempDir)) - assert.deepStrictEqual(cache.location, 'cache') - assert.ok(semver.satisfies(cache.version, lspConfig.supportedVersions)) - - /** - * Always make sure the latest version is one patch higher. This stops a problem - * where the fallback can't be used because the latest compatible version - * is equal to the min version, so if the cache isn't valid, then there - * would be no fallback location - * - * Instead, increasing the latest compatible lsp version means we can just - * use the one we downloaded earlier in the test as the fallback - */ - const nextVer = semver.inc(cache.version, 'patch', true) - if (!nextVer) { - throw new Error('Could not increment version') - } - sandbox.stub(ManifestResolver.prototype, 'resolve').resolves({ - manifestSchemaVersion: '0.0.0', - artifactId: 'foo', - artifactDescription: 'foo', - isManifestDeprecated: false, - versions: [createVersion(nextVer), createVersion(cache.version)], - }) - - // fail the next http request for the language server - sandbox.stub(request, 'fetch').returns({ - response: Promise.resolve({ - ok: false, - }), - } as any) - - // Third try - Cache doesn't exist and we couldn't download from the internet, fallback to a local version - const fallback = await resolver.resolve() - - assert.ok(fallback.assetDirectory.startsWith(tempDir)) - assert.deepStrictEqual(fallback.location, 'fallback') - assert.ok(semver.satisfies(fallback.version, lspConfig.supportedVersions)) - - /* First Try Telemetry - getManifest: remote succeeds - getServer: cache fails then remote succeeds. - validate: succeeds. - */ - const firstTryTelemetry: Partial[] = [ - { - id: lspConfig.id, - manifestLocation: 'remote', - languageServerSetupStage: 'getManifest', - result: 'Succeeded', - }, - { - id: lspConfig.id, - languageServerLocation: 'cache', - languageServerSetupStage: 'getServer', - result: 'Failed', - }, - { - id: lspConfig.id, - languageServerLocation: 'remote', - languageServerSetupStage: 'validate', - result: 'Succeeded', - }, - { - id: lspConfig.id, - languageServerLocation: 'remote', - languageServerSetupStage: 'getServer', - result: 'Succeeded', - }, - ] - - /* Second Try Telemetry - getManifest: remote fails, then cache succeeds. - getServer: cache succeeds - validate: doesn't run since its cached. - */ - const secondTryTelemetry: Partial[] = [ - { - id: lspConfig.id, - manifestLocation: 'remote', - languageServerSetupStage: 'getManifest', - result: 'Failed', - }, - { - id: lspConfig.id, - manifestLocation: 'cache', - languageServerSetupStage: 'getManifest', - result: 'Succeeded', - }, - { - id: lspConfig.id, - languageServerLocation: 'cache', - languageServerSetupStage: 'getServer', - result: 'Succeeded', - }, - ] - - /* Third Try Telemetry - getManifest: (stubbed to fail, no telemetry) - getServer: remote and cache fail - validate: no validation since not remote. - */ - const thirdTryTelemetry: Partial[] = [ - { - id: lspConfig.id, - languageServerLocation: 'cache', - languageServerSetupStage: 'getServer', - result: 'Failed', - }, - { - id: lspConfig.id, - languageServerLocation: 'remote', - languageServerSetupStage: 'getServer', - result: 'Failed', - }, - { - id: lspConfig.id, - languageServerLocation: 'fallback', - languageServerSetupStage: 'getServer', - result: 'Succeeded', - }, - ] - - const expectedTelemetry = firstTryTelemetry.concat(secondTryTelemetry, thirdTryTelemetry) - - assertTelemetry('languageServer_setup', expectedTelemetry) - }) - - it('resolves release candidiates', async () => { - const original = new ManifestResolver(lspConfig.manifestUrl, lspConfig.id).resolve() - sandbox.stub(ManifestResolver.prototype, 'resolve').callsFake(async () => { - const originalManifest = await original - - const latestVersion = originalManifest.versions.reduce((latest, current) => { - return semver.gt(current.serverVersion, latest.serverVersion) ? current : latest - }, originalManifest.versions[0]) - - // These convert something like 3.1.1 to 3.2.1-rc.0 - const incrementedVersion = semver.inc(latestVersion.serverVersion, 'minor') - if (!incrementedVersion) { - assert.fail('Failed to increment minor version') - } - - const prereleaseVersion = semver.inc(incrementedVersion, 'prerelease', 'rc') - if (!prereleaseVersion) { - assert.fail('Failed to create pre-release version') - } - - const newVersion = { - ...latestVersion, - serverVersion: prereleaseVersion, - } - - originalManifest.versions = [newVersion, ...originalManifest.versions] - return originalManifest - }) - - const download = await resolver.resolve() - assert.ok(download.assetDirectory.endsWith('-rc.0')) - }) - }) -}) diff --git a/packages/amazonq/test/e2e/lsp/lspInstallerUtil.ts b/packages/amazonq/test/e2e/lsp/lspInstallerUtil.ts new file mode 100644 index 00000000000..0031e627d8c --- /dev/null +++ b/packages/amazonq/test/e2e/lsp/lspInstallerUtil.ts @@ -0,0 +1,287 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import assert from 'assert' +import sinon from 'sinon' +import { + BaseLspInstaller, + DevSettings, + fs, + LanguageServerResolver, + makeTemporaryToolkitFolder, + ManifestResolver, + request, + TargetContent, +} from 'aws-core-vscode/shared' +import * as semver from 'semver' +import { assertTelemetry } from 'aws-core-vscode/test' +import { LspConfig, LspController } from 'aws-core-vscode/amazonq' +import { LanguageServerSetup } from 'aws-core-vscode/telemetry' + +function createVersion(version: string, contents: TargetContent[]) { + return { + isDelisted: false, + serverVersion: version, + targets: [ + { + arch: process.arch, + platform: process.platform, + contents, + }, + ], + } +} + +export function createLspInstallerTests({ + suiteName, + lspConfig, + createInstaller, + targetContents, + setEnv, + resetEnv, +}: { + suiteName: string + lspConfig: LspConfig + createInstaller: (lspConfig?: LspConfig) => BaseLspInstaller.BaseLspInstaller + targetContents: TargetContent[] + setEnv: (path: string) => void + resetEnv: () => void +}) { + describe(suiteName, () => { + let installer: BaseLspInstaller.BaseLspInstaller + let sandbox: sinon.SinonSandbox + let tempDir: string + + beforeEach(async () => { + sandbox = sinon.createSandbox() + installer = createInstaller() + tempDir = await makeTemporaryToolkitFolder() + sandbox.stub(LanguageServerResolver.prototype, 'defaultDownloadFolder').returns(tempDir) + // Called on extension activation and can contaminate telemetry. + sandbox.stub(LspController.prototype, 'trySetupLsp') + }) + + afterEach(async () => { + resetEnv() + sandbox.restore() + await fs.delete(tempDir, { + recursive: true, + }) + }) + + describe('resolve()', () => { + it('uses dev setting override', async () => { + const path = '/custom/path/to/lsp' + sandbox.stub(DevSettings.instance, 'getServiceConfig').returns({ + path, + }) + /** + * The installer pre-evaluates the config, so if we want to override the config + * we need to stub then re-create it + */ + const result = await createInstaller().resolve() + + assert.strictEqual(result.assetDirectory, path) + assert.strictEqual(result.location, 'override') + assert.strictEqual(result.version, '0.0.0') + }) + + it('uses environment variable override', async () => { + const overridePath = '/custom/path/to/lsp' + setEnv(overridePath) + + /** + * The installer pre-evaluates the config, so if we want to override the environment variables + * we need to override the env then re-create it + */ + const result = await createInstaller().resolve() + + assert.strictEqual(result.assetDirectory, overridePath) + assert.strictEqual(result.location, 'override') + assert.strictEqual(result.version, '0.0.0') + }) + + it('resolves', async () => { + // First try - should download the file + const download = await installer.resolve() + + assert.ok(download.assetDirectory.startsWith(tempDir)) + assert.deepStrictEqual(download.location, 'remote') + assert.ok(semver.satisfies(download.version, lspConfig.supportedVersions)) + + // Second try - Should see the contents in the cache + const cache = await installer.resolve() + + assert.ok(cache.assetDirectory.startsWith(tempDir)) + assert.deepStrictEqual(cache.location, 'cache') + assert.ok(semver.satisfies(cache.version, lspConfig.supportedVersions)) + + /** + * Always make sure the latest version is one patch higher. This stops a problem + * where the fallback can't be used because the latest compatible version + * is equal to the min version, so if the cache isn't valid, then there + * would be no fallback location + * + * Instead, increasing the latest compatible lsp version means we can just + * use the one we downloaded earlier in the test as the fallback + */ + const nextVer = semver.inc(cache.version, 'patch', true) + if (!nextVer) { + throw new Error('Could not increment version') + } + sandbox.stub(ManifestResolver.prototype, 'resolve').resolves({ + manifestSchemaVersion: '0.0.0', + artifactId: 'foo', + artifactDescription: 'foo', + isManifestDeprecated: false, + versions: [createVersion(nextVer, targetContents), createVersion(cache.version, targetContents)], + }) + + // fail the next http request for the language server + sandbox.stub(request, 'fetch').returns({ + response: Promise.resolve({ + ok: false, + }), + } as any) + + const config = { + ...lspConfig, + // contains the old version thats actually on disk + the new version + supportedVersions: `${cache.version} || ${nextVer}`, + } + + // Third try - Cache doesn't exist and we couldn't download from the internet, fallback to a local version + const fallback = await createInstaller(config).resolve() + + assert.ok(fallback.assetDirectory.startsWith(tempDir)) + assert.deepStrictEqual(fallback.location, 'fallback') + assert.ok(semver.satisfies(fallback.version, lspConfig.supportedVersions)) + + /* First Try Telemetry + getManifest: remote succeeds + getServer: cache fails then remote succeeds. + validate: succeeds. + */ + const firstTryTelemetry: Partial[] = [ + { + id: lspConfig.id, + manifestLocation: 'remote', + languageServerSetupStage: 'getManifest', + result: 'Succeeded', + }, + { + id: lspConfig.id, + languageServerLocation: 'cache', + languageServerSetupStage: 'getServer', + result: 'Failed', + }, + { + id: lspConfig.id, + languageServerLocation: 'remote', + languageServerSetupStage: 'validate', + result: 'Succeeded', + }, + { + id: lspConfig.id, + languageServerLocation: 'remote', + languageServerSetupStage: 'getServer', + result: 'Succeeded', + }, + ] + + /* Second Try Telemetry + getManifest: remote fails, then cache succeeds. + getServer: cache succeeds + validate: doesn't run since its cached. + */ + const secondTryTelemetry: Partial[] = [ + { + id: lspConfig.id, + manifestLocation: 'remote', + languageServerSetupStage: 'getManifest', + result: 'Failed', + }, + { + id: lspConfig.id, + manifestLocation: 'cache', + languageServerSetupStage: 'getManifest', + result: 'Succeeded', + }, + { + id: lspConfig.id, + languageServerLocation: 'cache', + languageServerSetupStage: 'getServer', + result: 'Succeeded', + }, + ] + + /* Third Try Telemetry + getManifest: (stubbed to fail, no telemetry) + getServer: remote and cache fail + validate: no validation since not remote. + */ + const thirdTryTelemetry: Partial[] = [ + { + id: lspConfig.id, + languageServerLocation: 'cache', + languageServerSetupStage: 'getServer', + result: 'Failed', + }, + { + id: lspConfig.id, + languageServerLocation: 'remote', + languageServerSetupStage: 'getServer', + result: 'Failed', + }, + { + id: lspConfig.id, + languageServerLocation: 'fallback', + languageServerSetupStage: 'getServer', + result: 'Succeeded', + }, + ] + + const expectedTelemetry = firstTryTelemetry.concat(secondTryTelemetry, thirdTryTelemetry) + + assertTelemetry('languageServer_setup', expectedTelemetry) + }) + + it('resolves release candidiates', async () => { + const original = new ManifestResolver(lspConfig.manifestUrl, lspConfig.id).resolve() + sandbox.stub(ManifestResolver.prototype, 'resolve').callsFake(async () => { + const originalManifest = await original + + const latestVersion = originalManifest.versions.reduce((latest, current) => { + return semver.gt(current.serverVersion, latest.serverVersion) ? current : latest + }, originalManifest.versions[0]) + + // These convert something like 3.1.1 to 3.1.2-rc.0 + const incrementedVersion = semver.inc(latestVersion.serverVersion, 'patch') + if (!incrementedVersion) { + assert.fail('Failed to increment minor version') + } + + const prereleaseVersion = semver.inc(incrementedVersion, 'prerelease', 'rc') + if (!prereleaseVersion) { + assert.fail('Failed to create pre-release version') + } + + const newVersion = { + ...latestVersion, + serverVersion: prereleaseVersion, + } + + originalManifest.versions = [newVersion, ...originalManifest.versions] + return originalManifest + }) + + const version = lspConfig.supportedVersions + lspConfig.supportedVersions = version.startsWith('^') ? version : `^${version}` + const download = await createInstaller(lspConfig).resolve() + assert.ok(download.assetDirectory.endsWith('-rc.0')) + }) + }) + }) +} diff --git a/packages/amazonq/test/e2e/lsp/workspaceContextLsp.test.ts b/packages/amazonq/test/e2e/lsp/workspaceContextLsp.test.ts new file mode 100644 index 00000000000..64e276fdc89 --- /dev/null +++ b/packages/amazonq/test/e2e/lsp/workspaceContextLsp.test.ts @@ -0,0 +1,42 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as os from 'os' +import { createLspInstallerTests } from './lspInstallerUtil' +import { getAmazonQWorkspaceLspConfig, LspClient, LspConfig, WorkspaceLspInstaller } from 'aws-core-vscode/amazonq' +import assert from 'assert' + +describe('AmazonQWorkspaceLSP', () => { + createLspInstallerTests({ + suiteName: 'AmazonQWorkspaceLSPInstaller', + lspConfig: getAmazonQWorkspaceLspConfig(), + createInstaller: (lspConfig?: LspConfig) => new WorkspaceLspInstaller.WorkspaceLspInstaller(lspConfig), + targetContents: [ + { + bytes: 0, + filename: `qserver-${os.platform()}-${os.arch()}.zip`, + hashes: [], + url: 'http://fakeurl', + }, + ], + setEnv: (path: string) => { + process.env.__AMAZONQWORKSPACELSP_PATH = path + }, + resetEnv: () => { + delete process.env.__AMAZONQWORKSPACELSP_PATH + }, + }) + + it('activates', async () => { + const ok = await LspClient.instance.waitUntilReady() + if (!ok) { + assert.fail('Workspace context language server failed to become ready') + } + const serverUsage = await LspClient.instance.getLspServerUsage() + if (!serverUsage) { + assert.fail('Unable to verify that the workspace context language server has been activated') + } + }) +}) diff --git a/packages/core/src/amazonq/index.ts b/packages/core/src/amazonq/index.ts index 383963df925..0f9c99a5ce8 100644 --- a/packages/core/src/amazonq/index.ts +++ b/packages/core/src/amazonq/index.ts @@ -46,6 +46,7 @@ export { extractAuthFollowUp } from './util/authUtils' export { Messenger } from './commons/connector/baseMessenger' export * from './lsp/config' export { ContentLengthError } from './errors' +export * as WorkspaceLspInstaller from './lsp/workspaceInstaller' import { FeatureContext } from '../shared/featureConfig' /** diff --git a/packages/core/src/amazonq/lsp/lspController.ts b/packages/core/src/amazonq/lsp/lspController.ts index 921329bb3c6..a789d1dd5cb 100644 --- a/packages/core/src/amazonq/lsp/lspController.ts +++ b/packages/core/src/amazonq/lsp/lspController.ts @@ -7,13 +7,12 @@ import * as vscode from 'vscode' import * as path from 'path' import { getLogger } from '../../shared/logger/logger' import { CurrentWsFolders, collectFilesForIndex } from '../../shared/utilities/workspaceUtils' -import { LspClient } from './lspClient' -import { activate as activateLsp } from './lspClient' +import { activate as activateLsp, LspClient } from './lspClient' import { telemetry } from '../../shared/telemetry/telemetry' import { isCloud9 } from '../../shared/extensionUtilities' import globals, { isWeb } from '../../shared/extensionGlobals' import { isAmazonInternalOs } from '../../shared/vscode/env' -import { WorkspaceLSPInstaller } from './workspaceInstaller' +import { WorkspaceLspInstaller } from './workspaceInstaller' import { lspSetupStage } from '../../shared/lsp/utils/setupStage' import { RelevantTextDocumentAddition } from '../../codewhispererChat/controllers/chat/model' @@ -196,7 +195,7 @@ export class LspController { private async setupLsp(context: vscode.ExtensionContext) { await lspSetupStage('all', async () => { - const installResult = await new WorkspaceLSPInstaller().resolve() + const installResult = await new WorkspaceLspInstaller().resolve() await lspSetupStage('launch', async () => activateLsp(context, installResult.resourcePaths)) this.logger.info('LspController: LSP activated') }) diff --git a/packages/core/src/amazonq/lsp/workspaceInstaller.ts b/packages/core/src/amazonq/lsp/workspaceInstaller.ts index 604aa89a9fd..99e70f20cbf 100644 --- a/packages/core/src/amazonq/lsp/workspaceInstaller.ts +++ b/packages/core/src/amazonq/lsp/workspaceInstaller.ts @@ -8,11 +8,11 @@ import { ResourcePaths } from '../../shared/lsp/types' import { getNodeExecutableName } from '../../shared/lsp/utils/platform' import { fs } from '../../shared/fs/fs' import { BaseLspInstaller } from '../../shared/lsp/baseLspInstaller' -import { getAmazonQWorkspaceLspConfig } from './config' +import { getAmazonQWorkspaceLspConfig, LspConfig } from './config' -export class WorkspaceLSPInstaller extends BaseLspInstaller { - constructor() { - super(getAmazonQWorkspaceLspConfig(), 'amazonqWorkspaceLsp') +export class WorkspaceLspInstaller extends BaseLspInstaller { + constructor(lspConfig: LspConfig = getAmazonQWorkspaceLspConfig()) { + super(lspConfig, 'amazonqWorkspaceLsp') } protected override async postInstall(assetDirectory: string): Promise { diff --git a/packages/core/src/dev/activation.ts b/packages/core/src/dev/activation.ts index 9d9e6d0acf4..8ce0f6aab11 100644 --- a/packages/core/src/dev/activation.ts +++ b/packages/core/src/dev/activation.ts @@ -25,7 +25,7 @@ import { NotificationsController } from '../notifications/controller' import { DevNotificationsState } from '../notifications/types' import { QuickPickItem } from 'vscode' import { ChildProcess } from '../shared/utilities/processUtils' -import { WorkspaceLSPInstaller } from '../amazonq/lsp/workspaceInstaller' +import { WorkspaceLspInstaller } from '../amazonq/lsp/workspaceInstaller' interface MenuOption { readonly label: string @@ -546,7 +546,7 @@ async function resetNotificationsState() { } async function resetWorkspaceLspDownload() { - await new WorkspaceLSPInstaller().resolve() + await new WorkspaceLspInstaller().resolve() } async function editNotifications() { From 668ba8ee2013489c5d28da84a874149fab795663 Mon Sep 17 00:00:00 2001 From: Josh Pinkney Date: Thu, 13 Mar 2025 12:51:41 -0400 Subject: [PATCH 2/2] fixup --- packages/amazonq/test/e2e/lsp/amazonqLsp.test.ts | 4 ++-- packages/amazonq/test/e2e/lsp/workspaceContextLsp.test.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/amazonq/test/e2e/lsp/amazonqLsp.test.ts b/packages/amazonq/test/e2e/lsp/amazonqLsp.test.ts index 53ed1edd7b4..d3e90ec4e8e 100644 --- a/packages/amazonq/test/e2e/lsp/amazonqLsp.test.ts +++ b/packages/amazonq/test/e2e/lsp/amazonqLsp.test.ts @@ -4,14 +4,14 @@ */ import { AmazonQLspInstaller } from '../../../src/lsp/lspInstaller' -import { getAmazonQLspConfig } from '../../../src/lsp/config' +import { defaultAmazonQLspConfig } from '../../../src/lsp/config' import { createLspInstallerTests } from './lspInstallerUtil' import { LspConfig } from 'aws-core-vscode/amazonq' describe('AmazonQLSP', () => { createLspInstallerTests({ suiteName: 'AmazonQLSPInstaller', - lspConfig: getAmazonQLspConfig(), + lspConfig: defaultAmazonQLspConfig, createInstaller: (lspConfig?: LspConfig) => new AmazonQLspInstaller(lspConfig), targetContents: [ { diff --git a/packages/amazonq/test/e2e/lsp/workspaceContextLsp.test.ts b/packages/amazonq/test/e2e/lsp/workspaceContextLsp.test.ts index 64e276fdc89..75d57949c0b 100644 --- a/packages/amazonq/test/e2e/lsp/workspaceContextLsp.test.ts +++ b/packages/amazonq/test/e2e/lsp/workspaceContextLsp.test.ts @@ -5,13 +5,13 @@ import * as os from 'os' import { createLspInstallerTests } from './lspInstallerUtil' -import { getAmazonQWorkspaceLspConfig, LspClient, LspConfig, WorkspaceLspInstaller } from 'aws-core-vscode/amazonq' +import { defaultAmazonQWorkspaceLspConfig, LspClient, LspConfig, WorkspaceLspInstaller } from 'aws-core-vscode/amazonq' import assert from 'assert' describe('AmazonQWorkspaceLSP', () => { createLspInstallerTests({ suiteName: 'AmazonQWorkspaceLSPInstaller', - lspConfig: getAmazonQWorkspaceLspConfig(), + lspConfig: defaultAmazonQWorkspaceLspConfig, createInstaller: (lspConfig?: LspConfig) => new WorkspaceLspInstaller.WorkspaceLspInstaller(lspConfig), targetContents: [ {