Skip to content

Commit 014c8b4

Browse files
committed
feat(amazonq): handle reference for inline with language server
1 parent e01574f commit 014c8b4

File tree

2 files changed

+112
-3
lines changed

2 files changed

+112
-3
lines changed

packages/amazonq/src/app/inline/completion.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { LanguageClient } from 'vscode-languageclient'
1919
import { LogInlineCompletionSessionResultsParams } from '@aws/language-server-runtimes/protocol'
2020
import { SessionManager } from './sessionManager'
2121
import { RecommendationService } from './recommendationService'
22-
import { CodeWhispererConstants } from 'aws-core-vscode/codewhisperer'
22+
import { CodeWhispererConstants, ReferenceInlineProvider } from 'aws-core-vscode/codewhisperer'
2323

2424
export class InlineCompletionManager implements Disposable {
2525
private disposable: Disposable
@@ -181,6 +181,11 @@ export class AmazonQInlineCompletionItemProvider implements InlineCompletionItem
181181
session.firstCompletionDisplayLatency,
182182
],
183183
}
184+
ReferenceInlineProvider.instance.setInlineReference(
185+
position.line,
186+
item.insertText as string,
187+
item.references
188+
)
184189
}
185190
return items as InlineCompletionItem[]
186191
}

packages/amazonq/test/unit/amazonq/apps/inline/completion.test.ts

Lines changed: 106 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55
import sinon from 'sinon'
6-
import { commands, languages } from 'vscode'
6+
import { CancellationToken, commands, languages, Position } from 'vscode'
77
import assert from 'assert'
88
import { LanguageClient } from 'vscode-languageclient'
9-
import { InlineCompletionManager } from '../../../../../src/app/inline/completion'
9+
import { AmazonQInlineCompletionItemProvider, InlineCompletionManager } from '../../../../../src/app/inline/completion'
10+
import { RecommendationService } from '../../../../../src/app/inline/recommendationService'
11+
import { SessionManager } from '../../../../../src/app/inline/sessionManager'
12+
import { createMockDocument } from 'aws-core-vscode/test'
13+
import { ReferenceInlineProvider } from 'aws-core-vscode/codewhisperer'
1014

1115
describe('InlineCompletionManager', () => {
1216
let manager: InlineCompletionManager
@@ -19,6 +23,10 @@ describe('InlineCompletionManager', () => {
1923
let sandbox: sinon.SinonSandbox
2024
let getActiveSessionStub: sinon.SinonStub
2125
let getActiveRecommendationStub: sinon.SinonStub
26+
const mockDocument = createMockDocument()
27+
const mockPosition = { line: 0, character: 0 } as Position
28+
const mockContext = { triggerKind: 1, selectedCompletionInfo: undefined }
29+
const mockToken = { isCancellationRequested: false } as CancellationToken
2230

2331
beforeEach(() => {
2432
sandbox = sinon.createSandbox()
@@ -179,4 +187,100 @@ describe('InlineCompletionManager', () => {
179187
})
180188
})
181189
})
190+
191+
describe('AmazonQInlineCompletionItemProvider', () => {
192+
describe('provideInlineCompletionItems', () => {
193+
const fakeReferences = [
194+
{
195+
message: '',
196+
licenseName: 'TEST_LICENSE',
197+
repository: 'TEST_REPO',
198+
recommendationContentSpan: {
199+
start: 0,
200+
end: 10,
201+
},
202+
},
203+
]
204+
const mockSuggestions = [
205+
{
206+
itemId: 'test-item',
207+
insertText: 'test',
208+
references: fakeReferences,
209+
},
210+
]
211+
let mockSessionManager: SessionManager
212+
let provider: AmazonQInlineCompletionItemProvider
213+
let getAllRecommendationsStub: sinon.SinonStub
214+
let recommendationService: RecommendationService
215+
let setInlineReferenceStub: sinon.SinonStub
216+
217+
beforeEach(() => {
218+
recommendationService = new RecommendationService(mockSessionManager)
219+
setInlineReferenceStub = sandbox.stub(ReferenceInlineProvider.instance, 'setInlineReference')
220+
221+
mockSessionManager = {
222+
getActiveSession: getActiveSessionStub,
223+
getActiveRecommendation: getActiveRecommendationStub,
224+
} as unknown as SessionManager
225+
226+
getActiveSessionStub.returns({
227+
sessionId: 'test-session',
228+
suggestions: mockSuggestions,
229+
isRequestInProgress: false,
230+
requestStartTime: Date.now(),
231+
})
232+
getActiveRecommendationStub.returns(mockSuggestions)
233+
getAllRecommendationsStub = sandbox.stub(recommendationService, 'getAllRecommendations')
234+
getAllRecommendationsStub.resolves()
235+
}),
236+
it('should call recommendation service to get new suggestions for new sessions', async () => {
237+
provider = new AmazonQInlineCompletionItemProvider(
238+
languageClient,
239+
recommendationService,
240+
mockSessionManager
241+
)
242+
const items = await provider.provideInlineCompletionItems(
243+
mockDocument,
244+
mockPosition,
245+
mockContext,
246+
mockToken
247+
)
248+
assert(getAllRecommendationsStub.calledOnce)
249+
assert.deepStrictEqual(items, mockSuggestions)
250+
}),
251+
it('should not call recommendation service for existing sessions', async () => {
252+
provider = new AmazonQInlineCompletionItemProvider(
253+
languageClient,
254+
recommendationService,
255+
mockSessionManager,
256+
false
257+
)
258+
const items = await provider.provideInlineCompletionItems(
259+
mockDocument,
260+
mockPosition,
261+
mockContext,
262+
mockToken
263+
)
264+
assert(getAllRecommendationsStub.notCalled)
265+
assert.deepStrictEqual(items, mockSuggestions)
266+
}),
267+
it('should handle reference if there is any', async () => {
268+
provider = new AmazonQInlineCompletionItemProvider(
269+
languageClient,
270+
recommendationService,
271+
mockSessionManager,
272+
false
273+
)
274+
await provider.provideInlineCompletionItems(mockDocument, mockPosition, mockContext, mockToken)
275+
assert(setInlineReferenceStub.calledOnce)
276+
assert(
277+
setInlineReferenceStub.calledWithExactly(
278+
mockPosition.line,
279+
mockSuggestions[0].insertText,
280+
fakeReferences
281+
)
282+
)
283+
})
284+
})
285+
})
182286
})

0 commit comments

Comments
 (0)