Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions packages/amazonq/src/lsp/activation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,29 @@ import vscode from 'vscode'
import { startLanguageServer } from './client'
import { AmazonQLspInstaller, getBundledResourcePaths } from './lspInstaller'
import { lspSetupStage, ToolkitError, messages, getLogger } from 'aws-core-vscode/shared'
import { getAmazonQLspConfig } from './config'

export async function activate(ctx: vscode.ExtensionContext): Promise<void> {
const config = getAmazonQLspConfig()
const registryUrl = config.registryUrl

try {
await lspSetupStage('all', async () => {
const installResult = await new AmazonQLspInstaller().resolve()
await lspSetupStage('launch', async () => await startLanguageServer(ctx, installResult.resourcePaths))
await lspSetupStage(
'launch',
async () => await startLanguageServer(ctx, installResult.resourcePaths, registryUrl)
)
})
} catch (err) {
const e = err as ToolkitError
getLogger('amazonqLsp').warn(`Failed to start downloaded LSP, falling back to bundled LSP: ${e.message}`)
try {
await lspSetupStage('all', async () => {
await lspSetupStage('launch', async () => await startLanguageServer(ctx, getBundledResourcePaths(ctx)))
await lspSetupStage(
'launch',
async () => await startLanguageServer(ctx, getBundledResourcePaths(ctx), registryUrl)
)
})
} catch (error) {
void messages.showViewLogsMessage(
Expand Down
4 changes: 3 additions & 1 deletion packages/amazonq/src/lsp/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@ export function hasGlibcPatch(): boolean {

export async function startLanguageServer(
extensionContext: vscode.ExtensionContext,
resourcePaths: AmazonQResourcePaths
resourcePaths: AmazonQResourcePaths,
registryUrl?: string
) {
const toDispose = extensionContext.subscriptions

Expand Down Expand Up @@ -188,6 +189,7 @@ export async function startLanguageServer(
codeReviewInChat: codeReviewInChat,
// feature flag for displaying findings found not through CodeReview in the Code Issues Panel
displayFindings: true,
registryUrl: registryUrl,
},
window: {
notifications: true,
Expand Down
3 changes: 3 additions & 0 deletions packages/amazonq/src/lsp/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {

export interface ExtendedAmazonQLSPConfig extends BaseLspInstaller.LspConfig {
ui?: string
registryUrl?: string
}

// Taken from language server runtimes since they are not exported:
Expand Down Expand Up @@ -44,10 +45,12 @@ export const defaultAmazonQLspConfig: ExtendedAmazonQLSPConfig = {
}

export function getAmazonQLspConfig(): ExtendedAmazonQLSPConfig {
const registryConfig = DevSettings.instance.get('amazonqRegistry', {})
return {
...defaultAmazonQLspConfig,
...(DevSettings.instance.getServiceConfig('amazonqLsp', {}) as ExtendedAmazonQLSPConfig),
...getServiceEnvVarConfig('amazonqLsp', Object.keys(defaultAmazonQLspConfig)),
registryUrl: (registryConfig as any)?.registryUrl,
}
}
/**
Expand Down
25 changes: 22 additions & 3 deletions packages/amazonq/test/unit/amazonq/lsp/config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { defaultAmazonQLspConfig, ExtendedAmazonQLSPConfig, getAmazonQLspConfig
describe('getAmazonQLspConfig', () => {
let sandbox: sinon.SinonSandbox
let serviceConfigStub: sinon.SinonStub
let getStub: sinon.SinonStub
const settingConfig: ExtendedAmazonQLSPConfig = {
manifestUrl: 'https://custom.url/manifest.json',
supportedVersions: '4.0.0',
Expand All @@ -24,8 +25,10 @@ describe('getAmazonQLspConfig', () => {
sandbox = sinon.createSandbox()

serviceConfigStub = sandbox.stub()
getStub = sandbox.stub()
sandbox.stub(DevSettings, 'instance').get(() => ({
getServiceConfig: serviceConfigStub,
get: getStub,
}))
})

Expand All @@ -36,29 +39,45 @@ describe('getAmazonQLspConfig', () => {

it('uses default config', () => {
serviceConfigStub.returns({})
assert.deepStrictEqual(getAmazonQLspConfig(), defaultAmazonQLspConfig)
getStub.returns({})
assert.deepStrictEqual(getAmazonQLspConfig(), { ...defaultAmazonQLspConfig, registryUrl: undefined })
})

it('overrides path', () => {
const path = '/custom/path/to/lsp'
serviceConfigStub.returns({ path })
getStub.returns({})

assert.deepStrictEqual(getAmazonQLspConfig(), {
...defaultAmazonQLspConfig,
path,
registryUrl: undefined,
})
})

it('overrides default settings', () => {
serviceConfigStub.returns(settingConfig)
getStub.returns({})

assert.deepStrictEqual(getAmazonQLspConfig(), settingConfig)
assert.deepStrictEqual(getAmazonQLspConfig(), { ...settingConfig, registryUrl: undefined })
})

it('environment variable takes precedence over settings', () => {
setEnv(settingConfig)
serviceConfigStub.returns({})
assert.deepStrictEqual(getAmazonQLspConfig(), settingConfig)
getStub.returns({})
assert.deepStrictEqual(getAmazonQLspConfig(), { ...settingConfig, registryUrl: undefined })
})

it('includes registryUrl from amazonqRegistry setting', () => {
const registryUrl = 'https://custom.registry.url/manifest.json'
serviceConfigStub.returns({})
getStub.withArgs('amazonqRegistry', {}).returns({ registryUrl })

assert.deepStrictEqual(getAmazonQLspConfig(), {
...defaultAmazonQLspConfig,
registryUrl,
})
})

function setEnv(envConfig: ExtendedAmazonQLSPConfig) {
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/shared/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,7 @@ const devSettings = {
codewhispererService: Record(String, String),
amazonqLsp: Record(String, String),
amazonqWorkspaceLsp: Record(String, String),
amazonqRegistry: Record(String, String),
cloudformationLsp: Record(String, String),
ssoCacheDirectory: String,
autofillStartUrl: String,
Expand Down